RabbitMQ与Kafka选型对比(一)

简介: RabbitMQ与Kafka选型对比(一)

背景

  

本公司是.Net项目,在.Net可选的MQ比较少,主要Kafka和RabbitMQ,RabbitMQ我也是使用多年了,最近的Kafka广告与流行度我也是无法无视,因此也是花了点时间收集了资料做了些对比。

  

如果下文有总结不到位的,或者差错的,可以在下方评论反馈给我


RabbitMQ模型


image.png


名词 描述
Queue 用于存储消息,消费者直接绑定Queue进行消费消息
Exchange 生产者将消息发送到Exchange,由交换器将消息通过匹配Exchange Type、Binding Key、Routing Key后路由到一个或者多个队列中。
Exchange Type Direct、Fanout、Topic、Headers
Routing Key 生产者发送消息给Exchange会指定一个Routing Key。
Binding Key 在绑定Exchange与Queue时会指定一个Binding Key

  

1.Exchange在声明时会绑定Queue和Binding Key,当Exchange收到消息会根据消息的

  

2.Routing Key与Exchange Type、Binding Key进行匹配,最后会路由到相关的队列当中。

  

Fanout,将消息发送到与该交换器所绑定的所有队列中,与Routing Key、Bind Key无关,这就是广播模式。

    

Topic,

通过对消息的Routing Key和Exchange、Queue进行匹配,将消息路由给一个或多个队列,以此来达到发布/订阅模式。

   

Direct,把消息路由到哪些Bind Key和Routing Key完全匹配的队列中。

   

Headers,不依赖与路由键的匹配规则,基本用不上。

  

3.消费者会直接订阅Queue里的消息进行消费,多个消费者订阅同个Queue会形成消息竞争状态,以此达到负载均衡作用。


Kafka模型


image.png


 

名词 描述
Topic 队列是通过Topic进行隔离的,生产者发送消息必须指定Topic
Broker 一个Kafka Server的被称为一个Broker。
Partition 每个Topic可以包含多个Partition,多个Partition会平均分配给同一个Consumer Group里的不同Consumer进行消费
Consumer Group 不在同一个Group 的Consumer能重复消费同一条消息(订阅),相同Group的Consumer存在消费竞争(负载均衡)


  1. Kafka与RabbitMQ比没有Exchange的概念,生产者直接发消息Topic(队列)。


  1. Kafka的订阅者是通过消费组(Consumer Group)来体现的,每个消费组都可以重复消费Topic一份完整的消息,不同消费组之间消费进度彼此不受影响。例如Message1能被Consumer Group 1和Consumer Group2里的消费者都消费一次。


  1. 消费组中包含多个消费者,同个Group的消费者之间是竞争消费的关系。例如Message2只能够被Consumer Group里某一个Consumer只消费一次。


  1. Kafka具有消息存储的功能,消息被消费后不会被立即删除,因为需要被不同的Consumer Group多次消费同个消息,因此会在Topic维护一个Consumer Offset,每消费成功Offset自增1.


功能对比


 

对比项 RabbitMQ Kafka
吞吐量
有序性 全局有序性 分区有序性
消息可靠性 多策略组合 消息持久化
流处理 不支持 支持
时效性
运维便捷度
系统依赖 zookeeper
Web监控 自带 第三方
优先级队列 支持 不支持
死信 支持 不支持
客户端支持 支持多种语言
社区生态
安全机制 (TLS/SSL、SASL)身份认证和(读写)权限控制
消息回溯 支持 不支持

 


对比描述


共同点


RabbitMQ与Kafka都有很好的客户端语言支持、安全机制与生态支持。


性能


Kafka的诞生的是处理高并发日志的,吞吐量比较高,每秒请求数达到数十万量级


RabbitMQ每秒请求数则为万级别,有测试报告指出Kafka是RabbitMQ的10倍以上性能。


运维便捷


RabbitMQ相对比较方便,可以使用yum或者docker安装,自带Web管理UI,没有额外的依赖,除了需要做镜像队列外需要引入HAproxy。


Kafka则需要依赖Zookeeper,也没有自带的管理工具,可以使用第三方的Kafka Eagle代替,Kafka Manager过于难用,另外Kafka没有yum安装,docker镜像也是社区人员自己建的。


有序性


RabbitMQ理论上是全局有序性的,但是由于【发后既忘】+【自动确认】机制的原因,如果在同个队列的多个消费者做相同的业务处理时,他们的各自的执行任务无法保证有序完成。如果确保100%有序可以使用【非自动确认】,但会影响消费性能。


Kafka支持分区有序性,如果对有序性有严格要求可以设置单个Partition,可是单个Partition并发性比较低,因此在多个Partition情况下可以根据业务指定key把相关的消息路由到同一个Partition,例如相同UserId行为信息可以到Partition 1进行处理。


时效性


Kafka基本上无论在客户端还是服务端都是以【异步批量】的机制进行处理,通俗的讲就是先攒起来一堆消息,到了某个阀值再发送,也会导致一些消息可靠性与消息有时效上的问题,当然可以通过各种配置策略进行解决。


消息回溯


Kafka在消费完了消息后不会立即删除,只会修改offset,如果之前部分业务消费失败了可以重新设置offset进行重新消费。


RabbitMQ则是[发后既忘]的机制,一但消费者确认消息则删除,但是可以通过死信进行补偿消费。此外RabbitMQ在队列消息堆积多的情况下性能表现不佳,所以尽可能的及时消费消息。


特色功能


RabbitMQ具有死信的功能,可以通过死信形成重复消费与延时发送。


Kafka具有流处理功能,可以收集用户的行为日志进行存储与分析。



Kafka为什么快?

关键核心技术点:


  • 异步批量处理
  • 磁盘顺序读写
  • 操作系统PageCache缓存数据
  • 零拷贝加速消费


Kafka的诞生就是为了高并发日志处理的,那么在他整个机制里使用了很多批量、异步、缓存。例如生产者客户端,他会积累一定量(条数、大小)的消息,再批量的发给kafka broker,如果在这段时间客户端服务挂了,就等于消息丢失了。当broker接受到了消息后,还有一堆骚操作-异步刷盘,也就是生产者发送给broker之后他是记录在缓存的,每隔一段时间才会持久化到磁盘,假如这段真空期broker挂了,消息也是丢了。


Kafka是否消息不可靠?


Kafka快是因为牺牲了消息可靠换取回来的性能,在最早期版本的确没提供消息可靠的策略,经过多个版本迭代后的功能完善,已经不存在这种旧观念。那么可靠的关键点有以下:


生产者


设置ack:


  • 0:producer不等待broker的ack,broker一接收到还没有写入磁盘就已经返回,可靠性最低;
  • 1:producer等待broker的ack,partition的leader刷盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据,可靠性中;
  • -1:producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack,数据一般不会丢失,延迟时间长但是可靠性高


消费者


设置enable.auto.commitrue,不管执行结果如何,消费者会自动提交offset。


false,需要用户需要手动提交offset,可以根据执行结果具体处理offset


选型总结


对于选择Kafka还是RabbitMQ,主要考虑三个因素:吞吐量运维能力平台熟悉度。如果是需要流处理和高并发的日志处理,首选Kafka。但是大部分公司并没有什么高并发的处理,因此可以着重考虑运维程度和平台熟悉度,前面提到Kafka也是有策略可以设置消息可靠的。RabbiMQ运维比较直接,包括客户端EasyNetQ使用简易性,基本上就是”开箱即用“。


目录
相关文章
|
18天前
|
消息中间件 存储 Kafka
RabbitMQ、RocketMQ和Kafka全面对决,谁是最佳选择?
1、应用场景 1.RabbitMQ: 适用于易用性和灵活性要求较高的场景 异步任务处理:RabbitMQ提供可靠的消息传递机制,适用于处理异步任务,例如将耗时的任务放入消息队列中,然后由消费者异步处理,提高系统的响应速度和可伸缩性。 解耦系统组件:通过使用RabbitMQ作为消息中间件,不同的系统组件可以通过消息进行解耦,实现松耦合的架构,提高系统的可维护性和灵活性。 事件驱动架构:RabbitMQ的发布-订阅模式可以用于构建事件驱动架构,将系统中的事件作为消息发布到相应的主题,不同的消费者可以订阅感兴趣的主题进行相应的处理。
246 2
|
18天前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
46 2
|
11天前
|
消息中间件 中间件 Java
RocketMQ实战教程之几种MQ优缺点以及选型
该文介绍了几种主流消息中间件,包括ActiveMQ、RabbitMQ、RocketMQ和Kafka。ActiveMQ和RabbitMQ是较老牌的选择,前者在中小企业中常见,后者因强大的并发能力和活跃社区而流行。RocketMQ是阿里巴巴的开源产品,适用于大规模分布式系统,尤其在数据可靠性方面进行了优化。Kafka最初设计用于大数据日志处理,强调高吞吐量。在选择MQ时,考虑因素包括性能、功能、开发语言、社区支持、学习难度、稳定性和集群功能。小型公司推荐使用RabbitMQ,而大型公司则可在RocketMQ和Kafka之间根据具体需求抉择。
|
17天前
|
消息中间件 前端开发 Java
java面试刷题软件kafka和mq的区别面试
java面试刷题软件kafka和mq的区别面试
|
18天前
|
消息中间件 Java Kafka
MQ产品使用合集之对于Kafka作为数据源的情况,官方比较推荐哪种使用方式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
18天前
|
消息中间件 监控 负载均衡
rabbitmq与kafka的区别
RabbitMQ提供了强大的可靠性保障,通过持久化机制和消息确认机制来确保消息的可靠传输和消费。而Kafka也提供了类似的可靠性保障,但其持久化机制和消息确认机制的实现方式与RabbitMQ有所不同。
|
18天前
|
消息中间件 存储 Kafka
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
62 1
|
18天前
|
消息中间件 监控 负载均衡
Kafka高级应用:如何配置处理MQ百万级消息队列?
在大数据时代,Apache Kafka作为一款高性能的分布式消息队列系统,广泛应用于处理大规模数据流。本文将深入探讨在Kafka环境中处理百万级消息队列的高级应用技巧。
201 0
|
7月前
|
消息中间件 存储 架构师
RabbitMQ vs Kafka:正面交锋(2)
RabbitMQ 是一个消息代理中间件,而 Apache Kafka 是一个分布式流处理平台。这种差异可能看起来只是语义上的,但它会带来严重的影响,影响我们方便地实现各种系统功能。 例如 Kafka 最适合处理流数据,在同一主题同一分区内保证消息顺序,而 RabbitMQ 对流中消息的顺序只提供基本的保证。
66 1
|
7月前
|
消息中间件 存储 Kafka
RabbitMQ vs Kafka:正面交锋(1)
值得注意的是,无论消费者是否消费了这些消息,Kafka 都会将消息保留在分区中直至预先配置的时间段内。这种保留意味着消费者可以自由地重读过去的消息。此外,开发人员还可以使用 Kafka 的存储层来实现事件溯源和审计日志等机制。
65 1