RocketMQ 为什么自研NameServer而不用zk

1、 RocketMQ 只需要一个轻量级的维护元数据信息的组件,为此引入zk增加维护成本还强依赖另一个中间件了;

2、 RocketMQ 追求的是AP,而不是CP,也就是需要高可用;

zk是CP,因为zk节点间通过zap协议有数据共享,每个节点数据会一致,但是zk集群当挂了一半以上的节点就没法使用了;

NameServer是AP,节点间不通信,这样会导致节点间数据信息会发生短暂的不一致,但每个broker都会定时向所有nameserver上报路由信息和心跳;当某个broker下线了,NameServer也会延时30s才知道,而且不会通知客户端(生产和消费者),只能靠客户端自己来拉,RocketMQ 是靠消息重试机制解决这个问题的,所以是最终一致性;但NameServer集群只要有一个节点就可用;