当前位置:网站首页>得物多活架构设计之路由服务设计
得物多活架构设计之路由服务设计
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 全量更新方案
- 用户注册
- 用户迁移
五、小结
边栏推荐
- Signature analysis of app x-zse-96 in a Q & a community
- What are the top ten securities companies in China? Is it safe to open a mobile account?
- The simplest DIY serial port Bluetooth hardware implementation scheme
- Gradienttape of tensorflow2
- DevEco Device Tool 助力OpenHarmony設備開發
- 运行时应用自我保护(RASP):应用安全的自我修养
- Video data annotation tools and platforms (data annotation company)
- Redis 入门-第三篇-数据结构与对象-字典
- KDD 2022 | 基于分层图扩散学习的癫痫波预测
- Comment Huawei Cloud réalise l'architecture mondiale de réseau audio - vidéo en temps réel à faible latence
猜你喜欢

Rancher 2.6 new monitoring QuickStart

【ML】QuantileRegressor
![Openharmony application development [01]](/img/b1/1e37cecd3d3f9e46444c202cfb1b99.png)
Openharmony application development [01]

How to implement a distributed lock with redis

tensorflow2的GradientTape求梯度

The simplest DIY actuator controller based on 51 single chip microcomputer

Simplest DIY steel patriot machine gun controller based on Bluetooth, 51 MCU and steering gear

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

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

2光2电级联型光纤收发器千兆2光2电光纤收发器迷你嵌入式工业矿用本安型光纤收发器
随机推荐
电感有极性吗?
Oversampling Series II: Fourier transform and signal-to-noise ratio
切比雪夫不等式证明及应用
汉源高科1路千兆光口转4路千兆以太网电口千兆1光4电光纤收发器
4路电话+1路千兆以太网4路PCM电话光端机
"Core" has spirit "lizard", ten thousand people are online! Dragon Dragon community walks into Intel meetup wonderful review
Deep analysis and Simulation of list
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!
基本数据类型和对应的包装类
开发增效利器—2022年VsCode插件分享
Monitor the cache update of Eureka client
在工作中学习的三个方法
Esp32-cam, esp8266, WiFi, Bluetooth, MCU, hotspot create embedded DNS server
Introduction and use of list
如何在 FlowUs、Notion 等笔记软件中使用间隔重复记忆系统?
自动化或电气专业必备软件
MySQL在一个字段中匹配多个值
Leetcode 1209. 删除字符串中的所有相邻重复项 II(牛逼,终于过了)
全国进入主汛期,交通运输部:不具备安全运行条件的线路坚决停运!
Groovy之Map操作