当前位置:网站首页>得物多活架构设计之路由服务设计
得物多活架构设计之路由服务设计
2022-06-23 11:35:00 【InfoQ】
一 、背景
二、多活/全球化的技术要求
三、多活/全球化的总体架构
3.1 领域建模
- PoP:网络服务接入点。(路由器、交换机等节点)
- DSA:动态站点加速,是访问由CDN厂商提供动态内容的加速器。

3.2 总体架构

- 全球用户:我们的系统会把全球用户分成不同的用户组,并且按照区域分为四组,即A洲、B洲、C洲和D洲。在调度执行时,常规的流程是把调度信息推送到每个用户组的 App 上。
- Edge 调度:静态信息的调度,决定了每个用户组应该使用哪个边缘节点。
- 网络调度:基于大数据实时统计每一条可行的链路并且由决策模型确定走哪一条路线。(跟路由没关系)
- 机房:提供解决方案的源头。
- 调度执行:PC 使用 DNS 技术进行调度,App 使用 HTTP-DNS 以及 PUSH 技术调度。(路由的使用)
- 调度控制:通过实时数据计算,确定具体的调度。(路由的产生以及配置)
四、多活/全球化区域化部署技术
4.1 整体架构
4.1.1 功能优先级
4.1.2 部署架构

4.1.3 问题分析
- 就近访问:用户会路由到固定的机房(正常情况下),并且确保用户的数据都是在同一个机房闭环。
- 异地容灾:由于应用是对等的,那么就要确定数据在备份机房里存在。
- 全球买、卖:将数据按需同步,将商品信息同步到全部机房。
- 数据一致性:确保单一数据master原则,即同一条数据只有一个机房会进行变更。会确保业务的优先级(买家>卖家>运营)。
4.1.4 解决方案


4.2 路由服务

- 路由服务结构
- 内存路由表:理解为 HashMap,key 为用户 id,value 为用户归属机房以及用户状态。
- RPC 服务。
- 路由表如何使用
- 用户请求进入机房第一个应用程序是同一接入层。使用 Nginx 作为统一接入的应用程序,Nginx 内嵌路由表,并且在多进程进行共享。Nginx 接受请求后做的第一件事情就是获取用户 id,然后调用路由表取得用户归属机房以及用户状态。若用户归属于本机房则继续向下透传。
- 下游需要路由信息直接获取上层丢下来的路由信息。如下图;

4.2.1 路由表原理
- 必须保存在内存。
- 保证性能和吞吐量。
- 不能依赖第三方系统。
- 路由设计应该支持自由升级。
4.2.1.1 方案比较
4.2.1.1.1引入分布式缓存
- 缺陷
- 所有的系统都要调用远程缓存,依赖性强。
- 用户归属变更,客户端缓存要更新,远程的缓存也要更新。
- 各方系统都要加入一个强依赖。
4.2.1.1.2 HashMap
- 缺陷
- 保存5000万条大约需要2GB内存。
4.2.1.1.3 布隆过滤器
- 缺陷
- 存在False Positive。
4.2.1.2 路由表设计

- 分段模式

4.2.1.3 路由表相关设计
- 当某个机房出现故障需要容灾切换时,如果基于现有的路由表实现方案,则需要变更对应机房所有用户的路由归属信息,可能涉及到几千万或者是上亿的用户变更,成本非常高。
- 在双十一的场景内,虽然可以通过大数据规划用户的行为分布,但是双十一一年才一次,学习样本少,很容易就会出现用户行为和预期不一致的现象,那就有可能会造成 A 洲机房的容量不足,但是美国的机房容量却很空余。此时就需要部分的 A 洲用户分流到美国机房,如果通过现在的路由表怎么支持呢?基于以上场景我们提出了一个叫做“逻辑机房”的概念。
- 当一切正常时,逻辑机房直接映射到一个原机房。
- 当发生容灾切换时,直接将逻辑机房映射到灾备机房。
- 当需要对部分用户进行分流时,按照用户 ID 进行 Hash 取模,将 Hash 结果不同的用户映射到不同的物理机房内。

4.2.2 路由表更新机制
- 数据一致性:在路由表变更的过程中,会出现一个用户的归属信息在不同的机房或者机器节点不一致的可能性。
- 可恢复、可回滚:无论系统处于什么状态,都可以确定性的恢复到一个期望状态。
- 快速变更:在一致性的保障过程,或者恢复、回滚的过程中,都会影响用户体验,甚至无法使用系统。所以在变更过程中需要在极短的时间内完成。
4.2.2.1 数据一致性思路


4.2.2.2 解决方案
4.2.2.2.1 数据准备与生效过程分离
- 数据准备过程就是将用户归属的信息写入分布式持久数据库中。
- 由于要求快速回滚,因为必须是多版本的写入。这就要求我们持久层数据库的数据是多版本的。准备好数据后,对版本的生效过程采用Zookeeper的watch机制进行交互,过程如下:
- 当需要进行路由变更时,会由路由变更控制程序将数据写入数据库中,并且定义版本号。
- 数据准备好之后,将版本号写入Zookeeper的监听节点中,所有watch都会受到推送。
- 需要加载路由表的机器读取数据库内的数据,并进行新版的路由表加载。

4.2.
2.2.2 一致性具体方案
- 所有的节点都会与Zk的currentVersion节点建立watcher,用于获取最新版本的推送。
- 所有的节点都会创建一个短暂节点,以机器名称命名,表示此节点正在监听变更,建立在SessionList目录下;当session消失时,表示这个节点不会在监听变更。
- 当节点被推送有新版本的变更后,它会使用这一个版本号去分布式数据库内查询数据(4.2.2.2.1之前已经准备好数据了)
- 当获取完成,并在本地内存中初始化路由表,会将机器名字作为节点写入AckList目录下的currentVersion子目录,表示此节点已经对于当前版本更新完成。
- 变更程序会比较AckList目录下的currentVersion子目录中的所有机器节点是否覆盖了SessionList目录下的所有机器节点,如果是则证明所有节点更新到最新版本。
- 因为我们知道所有节点是否已经更新完成,并且有与前后兼容的“禁写”状态,所以可以在所有节点都更新到“禁写”状态后,再进行新版本的路由信息变更,这样就可以确保出现的状态都是相互兼容的,从而保证了数据一致性问题。

4.2.2.3 整体架构

4.2.2.3 变更流程
- 保存当前版本号V1,用于处理回滚的方案。
- 获取当前机房列表,得到所有机房,循环调用每个机房的Agent,依次向下执行。
- 每个机房的Agent调用我们上述说的解决方案,将数据写入分布式数据库内。
- 如果失败,则直接调用第8步。
- 获取当前机房列表,得到所有机房,并且循环调用每个机房的Agent,将用户状态修改。
- 之后利用一致性的具体方案(4.2.2.2.2),并将所有用户状态改成最终状态。
- 如果失败,则直接调用第8步。如果成功,则流程结束。
- 循环调用每个机房的Agent,将版本回退。如果失败,则进行人工干预。
4.2.3 用户路由更新方案
4.2.3.1 确定
用户归属机房
- 每个用户都会在所有机房进行异步访问,用于确认用户和所有机房的延迟。
- 以用户区域为粒度进行统计,最稳定的机房是哪一个。
- 在路由表中将区域中每个用户与这个区域整体表现最好的机房做关联。

4.2.3.2 变更用户归属机房
4.2.3.3变更优化-分时变更



4.2.3.4 存量更新方案
- 方案刚上线
- 机器刚启动
4.2.3.5 全量更新方案
- 用户注册
- 用户迁移
五、小结
边栏推荐
- How to use note taking software flowus and note for interval repetition? Based on formula template
- 5 个关于 NFT 的技术漏洞
- 电容参数哪里找!?
- quarkus+saas多租户动态数据源切换实现简单完美
- 你真的理解LDO的输出电容吗!?
- At 14:00 today, 12 Chinese scholars started ICLR 2022
- 互联网奇迹-小米究竟是怎么盈利
- The country has entered the main flood season. The Ministry of transport: the lines that do not meet the conditions for safe operation will be resolutely shut down!
- mysql,如何在使用存储过程计算最大值
- Introduction to Huawei cloud maintenance and sharing exchange platform
猜你喜欢

【云原生&微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)

L'outil de périphérique deveco aide au développement de périphériques openharmony

2022年全国最新消防设施操作员(初级消防设施操作员)模拟题及答案

汉源高科新一代绿色节能以太网接入工业交换机高效节能型千兆工业以太网交换机

开发增效利器—2022年VsCode插件分享

tensorflow2的GradientTape求梯度

基本数据类型和对应的包装类

公开课丨玩的就是短视频!今晚教你精准变现!

汉源高科8路电话+1路百兆以太网RJ11电话光端机 8路PCM电话光端机

Esp32-cam, esp8266, WiFi, Bluetooth, MCU, hotspot create embedded DNS server
随机推荐
How does easygbs solve the abnormal use of intercom function?
如何用 Redis 实现一个分布式锁
【云驻共创】华为云HCIA-IoT V2.5培训系列内容之物联网概览
汉源高科1路非压缩4K-DVI光端机4K高清非压缩DVI转光纤4K-DVI高清视频光端机
直播带货app源码搭建中,直播CDN的原理是什么?
Leetcode 1209. 删除字符串中的所有相邻重复项 II(牛逼,终于过了)
L'outil de périphérique deveco aide au développement de périphériques openharmony
"Core" has spirit "lizard", ten thousand people are online! Dragon Dragon community walks into Intel meetup wonderful review
PPT制作3D旋转动画从入门到进阶
过采样系列二:傅里叶变换与信噪比
你真的理解LDO的输出电容吗!?
六张图详解LinkedList 源码解析
Esp32-cam, esp8266, WiFi, Bluetooth, MCU, hotspot create embedded DNS server
开发增效利器—2022年VsCode插件分享
RF analyzer demo setup
广播级E1转AES-EBU音频编解码器 E1转立体声音频卡侬头(XLR)编解码器
中国十大券商有哪些?手机开户安全么?
Tensorrt notes (4) Modèle de segmentation du raisonnement
请问,maxcompute执行sql查询有时特别慢是什么原因
Simplest DIY steel patriot machine gun controller based on Bluetooth, 51 MCU and steering gear