MQ与kafka有什么区别
kafka和mq的主要区别是:RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上;kafka是Linkedin于2010年12月份开源的消息发布订阅系统,它主要用于处理活跃的流式数据,大数据量的数据处理上。
# 1.语言不同
RabbitMQ是在由高并发的erlang语言开发,用在实时性要求比较高的消息传递上。
kafka是采用Scala语言开发的,它主要用于处理活跃的流逝数据,当数据量大且对实时性要求不是太高时可以使用。
# 2.架构模型不同
RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制。
kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。
# 3.broker和consumer交互方式不同
kafka:pull方式
rabbitMQ采用push的方式
# 4.吞吐量
首先两者的出发点是不同的:
MQ的目标是实现消息的可靠性传递,支持事务,不支持批量操作。基于存储的可靠性可以采用内存或者磁盘。
kafka设计目标,目标就是实现高吞吐量。内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。
# 5.可用性方面
rabbitMQ支持mirror的queue,主queue失效,mirror queue接管
kafka的broker支持主备模式。
# 6.集群负载均衡不同
rabbitMQ的负载均衡需要单独的loadbalancer进行支持。
kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。
# 7.使用场景
rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。金融场景中经常使用。
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度(与分区上的存储大小无关),消息处理的效率很高。(大数据)