1、背景
在异地双活场景下,不同地域的业务系统需要冗余部署,各自可以独立提供业务服务,以便在某个地域发生灾难性故障的时候,其它地域的服务能迅速把业务接管下来,因此不同地域的RPC集群均要求可以独立提供服务。但是又因为异地双活的场景,对数据进行了分区吗,不同的数据必须在不同的地域进行处理,避免写冲突,所以又要求RPC集群之间要可以互相访问。由于上述原因,所以需要对不同地域的RPC集群形成一个大集群,使得各个RPC服务都可以根据业务需要进行跨地域的访问。
2、问题
在服务注册双写方案中,需要在每个数据中心的用户实例区部署一个注册中心代理服务,在服务注册和注销的时候由这个注册中心代理服务向所有参与的RPC服务集群同时写入,在RPC服务监听的时候搜集所有的注册中心注册的服务,合并数据并且响应。这种方案不但实现起来复杂,需要部署额外的实例区注册中心代理服务,而且容易存在数据不一致问题。
较为常用的做法是对注册中心数据进行双向同步,每个数据中心的RPC服务只读写本地的注册中心即可,这样交互起来简单了不少,避免了数据不一致的问题,但是仍然存在数据中心过多的情况下交互逻辑复杂度上升,以及需要在用户实例区额外部署数据同步服务的问题,还要考虑服务的高可用问题等,用户使用的成本相当高。
结合多活管控架构后,结构变得更加复杂。
3、解决方案
基于全局管控的跨集群RPC服务,是在异地多活管控的基础上,附加了跨集群RPC同步的机制。
1、通过切面的方式拦截应用的注册、注销、订阅、取消订阅函数,在注册到本地注册中心的同时注册到多活管控中心。
2、多活管控中心监听到RPC服务的变化后,合并服务,再度将RPC服务列表下发给所有应用。
3、应用接收到RPC服务列表后,更新到本地内存中,刷新路由信息,完成跨集群RPC服务的注册与更新。
其优点是星状架构,交互简单,交互逻辑复杂度不会因为数据中心的数量上升而上升。同时利用了原有的多活架构基础设施,减少了用户的额外使用成本。