书籍链接:https://book.douban.com/subject/34782232/

主要针对第二章的全球区域化部署技术

1 总体架构

基本原则

image-20230504173921620

问题

image-20230504173955711

解决方案

image-20230504174017419

总体架构

image-20230504174056909

2 路由服务

image-20260312155945293

2.1 路由服务架构

透传技术优势:

1、无需在每一层维护一个路由表,不用过多关注路由数据一致性问题。

2、无需每次都调用路由表RPC服务,对RPC服务的依赖过大,调用量过高。

image-20230504175223691

2.2 路由表设计

1、基本模型

类似位图,通过用户id将bitmap对应的位置置为1。但是我们不仅需要存储用户是否存在的信息,还需要存储用户到机房的路由,所以用4个二进制位来存储用户到机房的映射。

前三位:机房标识

最后一位:用户状态

image-20230504175815913

2、分段存储

为了解决ID分布不均匀,存储浪费的问题,采取分段模式进行存储。用户没命中的段为null,不会占用内存。

image-20230504180053899

3、逻辑机房

1、路由信息巨大,机房迁移成本很高。

2、使流量均匀分布。

image-20230504180151875

4、一致性保障

定期MD5进行对比

image-20230504180358801

2.3 路由表更新机制

基于Zookeeper实现,引入“禁写”状态,即用户的路由表更新时,该用户无法进行业务写入,从而确保业务数据的全局一致性。架构如下:

image-20230504180808771

整体流程

image-20230504180717930

2.4 用户路由更新方案

1、确定用户归属机房

通过对各个机房的访问统计,将延迟最少的机房确认为最近的机房。

image-20230504181234535

2.5 多层路由实现

1、统一接入层路由技术

为所有网站用户提供统一的接入点,对多区域进行对等部署,并将用户归属到不同的区域。

方案:Openresty + Lua共享内存 + Redis + ProxyServer

2、服务层路由技术

业务相关,处理不同类型的数据,如:独享数据、共享数据。

1)用户优先级原则,如买家 > 卖家 > 平台运营人员。

2)数据类型及处理方法

  • 只读类型:不需要实时一致;处理:数据异步复制
  • 独享类型:只有一个用户可以对数据进行变更。处理:本地读写
  • 共享数据:多个用户需要共同变更同一条数据。处理:优先级最高的用户区域作为Master,可进行本地读写。非Master区域的用户需要区分情况决定是本地读写还是跨区域读写。
  • 全局共享数据:所有用户的行为都可以改变的数据,对一致性要求较高。处理:使用网络质量最好的机房存放数据,所有用户对全局共享数据的变更都被路由到这个机房。

3、消息层路由

异步调用时,如使用MQ进行调用,需要将消息路由到指定的机房。