rabbitmq、kafka、rocketMQ区别和选择

rabbitMQ和kafka

  • 语言
    kafka使用scala写的,rabbitmq使用erlang写的,rocketMQ使用java写的

  • 消费模型
    RabbitMQ中pull和push都有实现,kafka和rocketMQ中只有pull

  • 架构组成
    rabbtmq是基于AMQP协议开发,broker由exchange、binding、queue组成
    kafka采用mq结构,broker有分区的概念。所以可以更好的伸缩性,支持横向扩展。

  • 吞吐量
    kafka具有更高的吞吐量,内部采用消息的批量处理机制,使用的零拷贝机制,消息处理效率高。

  • 集群
    kafka的集群可以通过zk来管理。rabbitmq要通过第三方的haproxy和keeplive来实现

  • 延迟队列
    rabbitmq支持延迟消息,kafka不支持。

  • 路由分发
    路由的分发上,rabbit有通配符更加灵活。
    消息的留存上,kafka消费完了消息会保留,rabbitmq消费完了就回删除。kafka可以设置retention,清理消息。

  • Kafka功能比较的单一, 主要的就是支持收发消息,没有延迟消息实现

  • 选择上
    选择rabbitMQ情况,高级灵活的路由规则,需要延迟队列的支持。更简单的消费者实现。高级容错能力,保证消息不丢失,消费消息可以手动返回basicACK,保证消息正确消费。
    选择kafka情况:严格的消息顺序(同一个partition的消息时有序的),延长消息的留存时间,需要高伸缩的能力。

kafka和rocketMQ

  • 消息保存
    rocketmq每个broker的消息是统一存储在一个commitlog文件中,kafka是每个分区partition保存一定量的消息。
  • 注册中心
    kafka可以用使用zk统一管理broker,rocketmq使用的是一个namesever.
  • 引申 nameserver工作原理? 每个节点启动会遍历namesever,注册自己的信息,每个30秒发送心跳到到nameserver,nameserver每隔10秒检查一下,各个broker的心跳发送时间,超过120没有心跳,就认为挂掉,从路由消息里面移除
  • rockemq引申为什么不用zk呢? rocketmq早期也用了zk,后面为了去掉zk依赖,采用了自己的nameserver,使服务更加轻量级,也减少了维护成本。
  • 主从同步机制
    kafka的消息同步是follower 向master发起 fetch 请求,leader 收到请求以后,将数据返回给follower,同时更新同步的位置,达到消息同步
    rocketmq主从同步是,slave向master发送当前commitlog文件中的最大偏移量,master开始准备还未同步的数据,返回给slave,slave将数据同步,同时更新最大偏移量。
  • 刷盘持久化
    rocketMQ支持同步刷盘,每次消息写入都同步刷盘,保证数据可靠性,但是影响吞吐量。一般采用异步刷盘,同步双写。同步双写是指,消息同时写入master和slave的缓存中,才返回客户端成功,接着再异步刷盘持久化 ,可以保证数据不丢失(不然master故障后,有可能造成数据丢失)。
    kafka都是异步刷盘。返回的ack有三种,0-生产者不等待broker的ack,继续发送消息 1- 等待leader落盘返回 -1-主从全部落盘才返回ack
  • 吞吐量
    kafka的吞吐量更大
  • 延迟消息
    rocketmq支持延迟消息。
  • 消费消息
    rocketMQ查询更加灵活,除了queue的offset外,还可以指定key,查询适配的消息
  • 消费实时性
    kafka是通过轮询拉取消息,实时性取决轮询间隔。
    rocketmq是通过长连接方式,当有新消息时候,就立即拉取,实时性比较高。

rabbitMq和rocketMQ

  • rabbitMQ吞吐量很低,一秒只有几万的样子,横向扩展比较麻烦。采用erlang语言开发,不便于查找问题和维护。如果流量比较平稳,没有特别高的并发量,选择rabbitMQ足够。
  • rocketMQ吞吐量更高,采用了类似分片思想message queue,支持容量的横向扩展。如果公司发展迅猛,流量爆发式增加,又想使用一些高级功能,比如延迟消息,可以使用rocketMQ。
  • rabbitMQ和rocketMQ都可以保证消息不丢失
    rabbitMQ通过开启手动ACK、发送者确认模式保证消息不丢失。
    rocketMQ通过开启同步双写、同步刷盘的形式实现消息不丢失,但是同步刷盘性能较低。一般是采用的同步双写,异步刷盘(异步刷盘可能在broker宕机情况下,消息丢失)

MQ选型

  1. 如果我们业务只是做一些收发消息的单一需求,允许丢失消息的可能,但是又要求极高的吞吐量和高性能的话,就采用kafka,就比如日志收集,数据监控
  2. 如果公司业务平稳,没有巨大的并发量,也没有改源码的需求,可以选择用rabbitMQ
  3. 如果公司发展迅猛,经常搞一些秒杀活动,可以直接一步到位使用RocketMQ。
    参考

消息队列常使用的注意事项

如何保证系统的高可用

  • 就rabbitMq而言,有镜像模式概念,就是用户在发送数据时候,发送到mq机器上,并且持久化磁盘,然后通过设置镜像的queue,把数的持久化地址对应表同步到另外mq机器上。这种就有效防止一台mq挂了以后,另外的mq可以直接对外提供消费功能。
  • 就rocketMq而言,分为多主集群结构,多主多备异步复制结构,多主多备同步复制结构。

如何保证消息不会丢失

rabbitmq

  • 就rabbitmq而言,从生产者,消费者,消息队列角度分析。生产者而言,发送消息如果失败,则定义重试次数,一般设置成五次。两种解决方式1.通过设置事务模式,进行事务回滚重试。2.通过发送者异步确认确认模式开启。
    就mq本身而言,需要做队列的持久化到磁盘的操作
  • 对于exchange,还可以发送到备份交换机,或者将失败消息返回给生产者
  • 开启消费者手动确认模式,保证成功消费了,再删除消息
  • 总结就是一句话:发送者确认模式开启,消息持久化默认开启,消费者消费开启手动ack

rocketMq

  • rocketMq而言,就是开始同步双写(master和slave同时写入缓存成功然后返回ack),异步刷盘(极端情况服务器突然宕机的情况,会丢失数据。如果要保证消息绝对不丢失,就开启同步刷盘,但是吞吐量会降低)

  • 消费阶段,消费成功返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS 状态给 Broker。没有返回的就可以继续消费。

  • 这里要注意实现消息的幂等性,可以给消息定义唯一键,防止消息重复

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: RabbitMQ, Kafka, 和 RocketMQ 是三种不同的消息队列系统,它们各有特点。 RabbitMQ是一种面向消息的中间件,支持高可用性和分布式部署。 Kafka是一种高吞吐量的分布式流式数据平台,适用于实时数据处理和分析。 RocketMQ是一种分布式消息系统,支持高吞吐量和高可靠性。 总的来说,选择哪种系统取决于你的特定需求,如吞吐量,可靠性,实时性等。 ### 回答2: RabbitMQKafkaRocketMQ 都是当前比较常用的消息中间件,它们都有着优秀的可靠性、可扩展性、性能和高可用性。但是它们在一些功能和设计上还是有所不同的。 1. 消息传输方式 RabbitMQ 是 AMQP(Advanced Message Queuing Protocol)的实现,使用的是消息推送方式。AMQP 协议适用于面向传输层(TCP/IP)的异步通信,实现可靠的消息传输。 Kafka 是基于 publish-subscribe 模式的消息传递,使用的是 pull-based 方式。Kafka 使用了分区机制,将每个主题按照分区策略分成多个分区存储在不同的节点上,每个分区对应一个消费者组。 RocketMQ 也是基于 publish-subscribe 模式的消息传递,使用的是 push-based 方式。RocketMQ 同样支持分区机制,并且支持单播(点对点)和广播两种消息模式。 2. 可靠性和事务支持 RabbitMQ 是 AMQP 协议的实现,其可靠性方面比较出色,支持事务机制,能够保证消息的可靠传输。同时 RabbitMQ 支持主从和镜像队列,能够确保高可用性。 Kafka 也是一个高可靠的消息系统,使用 ZooKeeper 进行协调管理,可用性好。Kafka 对消息的可靠性保证基于以分区为单位的消息复制机制。但是 Kafka 不支持事务,需要自己实现。 RocketMQ 的可靠性、事务方面都做得很好。RocketMQ 支持可靠异步传输和可靠同步传输两种模式,并且支持事务消息。 3. 性能 Kafka 在性能方面表现非常出色,每秒可以处理数百万条消息。Kafka 将消息存储在磁盘上,通过批量写入、零拷贝、多线程等技术实现了非常高的性能。 RocketMQ 在性能方面也表现出色,读写效率都非常高。RocketMQ 采用的是 Zero-Copy 技术和消息内存映射机制,能够极大地提高性能。 RabbitMQ 的性能不如 KafkaRocketMQ,但实现比较简单,开发和维护相对容易。 4. 社区贡献和生态系统 Kafka 的社区非常活跃,生态系统比较完善,能够实现很多基于 Kafka 的周边产品,如 Kafka Connect、Kafka Streams、KSQL 等。 RabbitMQ 在可插拔性和高可靠性方面做得比较好。RabbitMQ 有大量的插件可以集成各种不同的业务场景,但是生态系统相对较小。 RocketMQ 的社区相对于 Kafka 来说比较年轻,但已有很多用户在生产环境中使用,并且生态系统正在逐渐完善。 综上所述,RabbitMQKafkaRocketMQ 都是优秀的消息中间件,用户应根据具体业务场景需求来选择适合自己的消息中间件。如果需要可靠性和事务支持,可以选择 RabbitMQRocketMQ;如果追求高性能和数据的实时处理、大数据场景下的数据传输和存储,可以选择 Kafka。 ### 回答3: RabbitMQKafkaRocketMQ都是当前非常热门的消息中间件。它们在一定程度上有相似之处,但也有很大的不同。下面就从多个维度来比较它们。 1. 引入背景 RabbitMQKafka都是在2007年左右诞生的,它们出现的时候,主要解决的是MQ的技术难题。RabbitMQ最早是由LShift公司的一群开发人员开发,主要是基于AMQP协议,用Erlang语言编写;Kafka则是由LinkedIn公司开发,最初将其用于处理LinkedIn的大量数据,后来成为了Apache的开源项目。而RocketMQ则是在2012年左右开始开发的,主要是由阿里巴巴开发,也是基于Apache RocketMQ的开源项目。 2. 架构设计 RabbitMQ的架构设计是基于AMQP协议的,采用Erlang语言实现,因此具有较高的可靠性和扩展性,也有很多 plugins 可以使用。RabbitMQ 的架构包含 Exchange(交换机)、Queue(队列)、Binding(绑定)和 Virtual Host(虚拟主机)4个主要部分。 Kafka的架构设计则是基于Pub/Sub模式,它以专门存储消息的Topic为核心,而且Kafka只提供了一小部分的API,主要是向 Producer 和 Consumer 暴露API,并利用 ZooKeeper 进行协调管理。 RocketMQ的架构设计是基于分布式的架构设计,通过 Name Server 管理 Topic 信息和 Broker 状态,Broker 通过实现 Master-Slave 备份机制来保证高可用性。 3. 性能比较 在性能方面,Kafka相对而言,吞吐能力最强,支持每秒数百万级别的消息处理,非常适合高吞吐量且处理逻辑简单的场景。而RabbitMQRocketMQ相对而言则处理能力较低,并发高负载会导致性能下降。同时在可扩展性方面,RabbitMQRocketMQ相对而言更加灵活,可根据实际需求动态调整集群规模,而Kafka则稍微有些麻烦。 4. 支持性比较 在支持的消息协议方面,KafkaRocketMQ同时支持自定义协议,而RabbitMQ则主要支持AMQP协议。同时在支持的编程语言方面,Kafka支持Java、Scala、Python、.NET等语言,RocketMQ主要支持Java语言,而RabbitMQ同样支持Java、C#、JavaScript等多种编程语言。 总体来看,每个消息中间件都有自己的优势和局限性,选择哪种消息中间件主要取决于实际的业务需求、架构设计和数据规模等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmineWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值