游客发表

前面几篇文章分享了kafka 相关的础概实现逻辑,kafka在大吞吐量方面有较好的念和表现,但是架构有时候我们需要实现比较复杂的业务逻辑从而对于吞吐量方面要求不是太高,这个时候我们就可以选择RocketMQ.
我们知道kafka 的性能非常好,吞吐量也非常大。体系Kafka单机写入 TPS 号称在百万条/秒;追求性能的础概话,Kafka单机性能更高。念和这也依靠基于他的架构顺序写入,Memory Mapped Files 技术 和消费者端的知识zero copy。(kafka基于sendfile实现Zero Copy,体系直接从内核空间(DMA的础概)到内核空间(Socket的),然后发送网卡。念和)但是架构对平常工作中各种复杂的应用场景及对数据可靠性要求严格的业务就有点力不从心了。我们从以下几个方面分析:
【数据可靠性方面】
RocketMQ所支持的知识同步方式提升了数据的可靠性,RocketMQ支持异步/同步刷盘;异步/同步Replication;Kafka使用异步刷盘方式,体系异步Replication。
【消息顺序性】
Kafka 某些配置下,支持消息顺序,云服务器但是一台Broker宕机后,就会产生消息乱序;
RocketMQ支持严格的消息顺序,在顺序消息场景下,一台Broker宕机后,
发送消息会失败,但是不会乱序;
【关于定时/延时消息】
Kafka不支持定时消息;
RocketMQ支持定时消息;
【关于分布式事务消息】
Kafka不支持分布式事务消息;RocketMQ支持分布式事务消息
【关于消息查询机制】
Kafka不支持消息查询。
RocketMQ支持根据Message Id查询消息,也支持根据消息内容查询消息
【关于Broker 的设计上】
当broker里面的topic的partition数量过多时,kafka的性能却不如rocketMQ。
kafka和rocketMq都使用文件存储,但是kafka是一个分区一个文件,当topic过多,分区的总量也会增加,kafka中存在过多的文件,当对消息刷盘时,就会出现文件竞争磁盘,出现性能的下降。一个partition(分区)一个文件,顺序读写。一个分区只能被一个消费组中的一个 消费线程进行消费,WordPress模板因此可以同时消费的消费端也比较少。
rocketMq所有的队列都存储在一个文件中,每个队列的存储的消息量也比较小,因此topic的增加对rocketMq的性能的影响较小。rocketMq可以存在的topic比较多,可以适应比较复杂的业务。


NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。注意:当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。 Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic 服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。 Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向Master拉取消息时,Master服务器会根据拉取偏移量与最大偏移量的距离(判断是否读老消息,产生读I/O),以及从服务器是否可读等因素建议下一次是从Master还是Slave拉取。


随机阅读
热门排行
友情链接