一般的IDC集群部署都是单机房,但是有个很严重的问题,就是异地多活情况下,如何做跨IDC的消息数据同步。
需要明确的是,消息中间件的部署隐含了如下要求:
消息的写入必须是迅速的,但是消息的读取可以有一定延时。在设计上需要牢牢把握住这个宗旨。
假设部署两地四中心。A地 A1,A2机房 B地 B1,B2机房。
以下以rocketmq为例说明部署方式:
1. 对任意的topic,经过中间件修改后,真正的topic为city-topic。例如,A机房的业务服务器发送xx topic. 则实际发送的topic经过
消息客户端中间件修改后,实际发送给消息中间件的topic为A-xx,基于单元化改造后,对应的该消息的tag为passid。
2. 对于任意xx消息的接收方,连接所有消息中间件,接收全部以xx结尾的topic。例如:A-xx和B-xx消息均接收。如果做了单元化改造,接收的消息tag为本单元能处理的passid范围。例如:00-100.这样可以使用到消息的服务端过滤功能
3.本地机房消息服务器部署采用主备双写的模式。A机房的机器只接收A-为前缀的消息topic。B机房同理。这样做的目的是保证消息的写入仅在同城机房,写入速度快。
4.作为consumer端,可以消费A,B两个机房全部的xx为后缀的消息,消息的接收可以有一定的延时。
5.本质上是将全国的机房整体作为一个消息集群。这里需注意,为了达到这个目的,注册中心一定要是一个AP系统,决不能是一个
CP系统。CP系统超过一半机器不可用,就无法提供服务,为了CP系统的通信效率,一般并不进行跨多机房部署,一次不适合这种架构。rocketmq的nameserver本身就是一个AP系统,可以在全国多地部署,共同组成一个注册中心集群。