看完这篇文章告诉你RocketMQ为什么要放弃Zookeeper?

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 一位7年工作经验的小伙伴去面架构师岗位,被问到这样一道面试题,说”RocketMQ为什么要放弃Zookeeper“。然后,想了很久好像没关注过,也不敢瞎猜。那么今天,我给大家来聊一聊我对这个问题的理解。

一位7年工作经验的小伙伴去面架构师岗位,被问到这样一道面试题,说”RocketMQ为什么要放弃Zookeeper“。然后,想了很久好像没关注过,也不敢瞎猜。


那么今天,我给大家来聊一聊我对这个问题的理解。

1、注册中心

36fd9a9541fe6dabeebb81df8804f405.png

对于分布式消息中间件而言,当不同的消息存储在不同的Broker上,生产者和消费者对于Broker的选取,路由选择会面临以下几个问题:


1、生产者发一条消息,应该发到哪个Broker?消费者接收消息,从哪个Broker获取消息?


2、如果Broker增加或者减少了,客户端怎么知道?


3、一个新的生产者或者消费者加入,如何感知?


所以,只要是跟分布式服务调用的场景,都需要一个注册中心,在RocketMQ当然也中需要有一个这样的角色来管理Broker的信息。

644a2776d24aecd416111eee6c715e36.png

而Kafka就是用了现成的Zookeeper,但是RocketMQ却偏偏没有这么做,而是自己实现了一个服务,这个服务叫做NameServer。


我们可以把NameServer理解为是RocketMQ的路由中心,每一个NameServer节点都保存了全量的路由信息。为了保证高可用,NameServer自身也可以做集群的部署。它的作用有点像Eureka或者Redis的Sentinel。


也就是说,Broker会在NameServer上注册自己,Porducer和Consumer用NameServer来发现Broker。

c206f15cdfc1b0c1e30a04437528c679.png

每个Broker节点在启动时,都会根据配置遍历NameServer列表。


与每个NameServer建立TCP长连接,注册自己的信息,之后每隔30s发送心跳信息。


如果Broker挂掉了,不发送心跳了,NameServer怎么发现呢?


所以,除了主从注册,还有定时探活。每个NameServer每隔10s检查一下各个Broker的最近一次心跳时间,如果发现某个Broker超过120s都没发送心跳,就认为这个Broker已经挂掉了,会将其从路由信息里移除。

2、放弃理由

既然,Nameserver的作用也是用来管理Broker的服务的,也就是服务注册与发现,那为什么不直接用Zookeeper、Consul、etcd、Eureka这样的组件呢?


实际上在RocketMQ的早期版本中,跟Kafka一样也是用Zookeeper实现服务管理的,但到RokcetMQ开源的时候去掉了ZooKeeper依赖,转而采用自己的NameServer。

42ff3607ad8e533c412b516f4e844dfa.png

因为,RocketMQ是一个保持最终一致性的架构设计,它架构决定了它只需要一个轻量级的元数据服务器就足够了,而不需要像Zookeeper这样的强一致性解决方案。不依赖另一个中间件,从而减少整体维护成本。

3b40c5cccb838de3a517c8d179d7b474.png

根据著名的CAP理论,在一致性(Consistency)、可用性(Availability)、分区容错性(Partiton Tolerance)中,Zookeeper实现了CP,而NameServer选择了AP,放弃了实时一致性。


以上就是我对RocketMQ为什么要放弃Zookeeper的理解!

我是被编程耽误的文艺Tom,关注我,面试不再难!

ee90d9963df444db88b33d6e798a5b94.gif

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
消息中间件 存储 分布式计算
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(二)
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(二)
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(二)
|
消息中间件 负载均衡 Kafka
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(三)
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(三)
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(三)
|
消息中间件 存储 负载均衡
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(一)
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(一)
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一(一)
|
Java Apache 开发工具
一篇文章带你入门Zookeeper
Zookeeper是什么 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
2575 0
|
存储 消息中间件 中间件
读懂这篇文章,你的阿里技术面就可以过关了 | Apache RocketMQ 101
在美国的大学课程中,101是所有课程中的第一门,是新生入学后的必修课程。阿里巴巴中间件技术专家刘振东在上周的Apache RocketMQ开发者沙龙北京站的活动上,进行了主题为《ApacheRocketMQ 101》的分享,帮助开发者从0开始学习 Apache RocketMQ,除了一些基础的入门内容外,还有很多是在社区未发表过的个人所感所悟,首次对外分享。
5777 0
|
2月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
2月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
6天前
|
消息中间件
手撸MQ消息队列——循环数组
队列是一种常用的数据结构,类似于栈,但采用先进先出(FIFO)的原则。生活中常见的排队场景就是队列的应用实例。在数据结构中,队列通常用数组实现,包括入队(队尾插入元素)和出队(队头移除元素)两种基本操作。本文介绍了如何用数组实现队列,包括定义数组长度、维护队头和队尾下标(front 和 tail),并通过取模运算解决下标越界问题。此外,还讨论了队列的空与满状态判断,以及并发和等待机制的实现。通过示例代码展示了队列的基本操作及优化方法,确保多线程环境下的正确性和高效性。
14 0
手撸MQ消息队列——循环数组

热门文章

最新文章