赞
踩
一、语言不同
RabbitMQ是由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上。
kafka是采用Scala语言开发,它主要用于处理活跃的流式数据,大数据量的数据处理上
RocketMQ是采用java语言开发的
二、吞吐量
kafka吞吐量更高:
1)Zero Copy机制,内核copy数据直接copy到网络设备,没必要通过内核到用户再到内核的copy,减少了copy次数和上下文切换次数,大大提升了效率。
2)磁盘顺序读写,减小了寻道等待的时间。
3)批量处理机制,服务端批量存储,客户端主动批量pull数据,消息处理效率高。
4)存储具备O(1)的复杂度,读物由于分区和segment,是O(log(n))的复杂度。
5)分区机制,有助于提升吞吐量。
三、可靠性
rabbitmq可靠性更好:
1)确认机制(生产者和exchange,消费者和队列);
2)支持事务,但会形成阻塞;
3)委托(添加回调来处理发送失败的消息)和备份交换器(将发送失败的消息存下来后面再处理)机制;
四、高可用
1)rabbitmq采用mirror queue,即主从模式,数据是异步同步的,当消息过来,主从所有写完后,回ack,这样保障了数据的一致性。
2)每一个分区均可以有一个或多个副本,这些副本保存在不一样的broker上,broker信息存储在zookeeper上,当broker不可用会从新选举leader。
kafka支持同步负责消息和异步同步消息(有丢消息的可能),生产者从zk获取leader信息,发消息给leader,follower从leader pull数据而后回ack给leader。
五、负责均衡
1)kafka经过zk和分区机制实现:zk记录broker信息,生产者能够获取到并经过策略完成负载均衡;经过分区,投递消息到不一样分区,消费者经过服务组完成均衡消费。
2)须要外部支持。
六、模型
1)rabbitmq:
producer,broker遵循AMQP(Advanced Message Queuing Protocol,高级消息队列协议是一个进程间传递异步消息的网络协议)(由Exchange,Binding,queue组成),consumer;
broker为中心,exchange分topic,direct,fanout和header,路由模式适合多种场景;
consumer消费位置由broker经过确认机制保存;
2)kafka:
producer,broker,consumer,未遵循AMQP;
consumer为中心,获取消息模式由consumer本身决定;
offset保存在消费者这边,broker无状态;
消息是名义上的永久存储,每一个parttition按segment保存本身的消息为文件(可配置清理周期);
consumer能够经过重置offset消费历史消息;
须要绑定zk;
kafka采用mq结构:broker 有part 分区的概念
RabbitMQ 采用push的方式
kafka采用pull的方式
rabbitMQ的负载均衡需要单独的loadbalancer进行支持。
kafka采用zookeeper对集群中的broker、consumer进行管理
总结:RocketMQ的同步刷盘在单机可靠性上比Kafka更高,不会因为操作系统Crash,导致数据丢失。 同时同步Replication也比Kafka异步Replication更可靠,数据完全无单点。另外Kafka的Replication以topic为单位,支持主机宕机,备机自动切换,但是这里有个问题,由于是异步Replication,那么切换后会有数据丢失,同时Leader如果重启后,会与已经存在的Leader产生数据冲突。开源版本的RocketMQ不支持Master宕机,Slave自动切换为Master,阿里云版本的RocketMQ支持自动切换特性。
总结:Kafka的TPS跑到单机百万,主要是由于Producer端将多个小消息合并,批量发向Broker。
RocketMQ为什么没有这么做?
队列多有什么好处?
总结:例如充值类应用,当前时刻调用运营商网关,充值失败,可能是对方压力过多,稍后在调用就会成功,如支付宝到银行扣款也是类似需求。
这里的重试需要可靠的重试,即失败重试的消息不因为Consumer宕机导致丢失。
Mysql Binlog分发需要严格的消息顺序
总结:消息查询对于定位消息丢失问题非常有帮助,例如某个订单处理失败,是消息没收到还是收到处理出错了。
总结:典型业务场景如consumer做订单分析,但是由于程序逻辑或者依赖的系统发生故障等原因,导致今天消费的消息全部无效,需要重新从昨天零点开始消费,那么以时间为起点的消息重放功能对于业务非常有帮助。
Kafka的消费并行度依赖Topic配置的分区数,如分区数为10,那么最多10台机器来并行消费(每台机器只能开启一个线程),或者一台机器消费(10个线程并行消费)。即消费并行度和分区数一致。
RocketMQ消费并行度分两种情况
理论上Kafka要比RocketMQ的堆积能力更强,不过RocketMQ单机也可以支持亿级的消息堆积能力,我们认为这个堆积能力已经完全可以满足业务需求。
五、使用场景
rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。
金融场景中经常使用
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度(与分区上的存储大小无关),消息处理的效率很高。(大数据)
补充:
Server:又称Broker,接受客户端的连接,实现AMQP实体服务
Connection:连接,应用程序与Broker的网络连接
Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。
Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容。
Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个VirtualHost 里面不能有相同名称的Exchange或Queue
Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列
Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key
Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息
Producer:消息生产者,向Broker发送消息的客户端
Consumer:消息消费者,从Broker读取消息的客户端
Broker:消息中间的处理节点,这里和kafka不同,kafka的Broker没有主从的概念,都可以写入请求以及备份其他节点数据,RocketMQ只有主Broker节点才能写,一般也通过主节点读,当主节点有故障或者一些其他特殊情况才会使用从节点读,有点类似- 于mysql的主从架构。
Topic:消息主题,一级消息类型,生产者向其发送消息, 消费者读取其消息。
Group:分为ProducerGroup,ConsumerGroup,代表某一类的生产者和消费者,一般来说同一个服务可以作为Group,同一个Group一般来说发送和消费的消息都是一样的。
Tag:Kafka中没有这个概念,Tag是属于二级消息类型,一般来说业务有关联的可以使用同一个Tag,比如订单消息队列,使用Topic_Order,Tag可以分为Tag_食品订单,Tag_服装订单等等。
Queue: 在kafka中叫Partition,每个Queue内部是有序的,在RocketMQ中分为读和写两种队列,一般来说读写队列数量一致,如果不一致就会出现很多问题。
NameServer:Kafka中使用的是ZooKeeper保存Broker的地址信息,以及Broker的Leader的选举,在RocketMQ中并没有采用选举Broker的策略,所以采用了无状态的NameServer太存储,由于NameServer是无状态的,集群节点之间并不会通信,所以上传数据的时候都需要向所有节点进行发送。
引用:https://www.jianshu.com/p/0364a171c2ae
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。