消息队列之争:RabbitMQ vs. RocketMQ - 揭晓胜者

背景

消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。本文将介绍一下

RabbitMQ

介绍

RabbitMQ 是采用 Erlang 语言实现的 AMQP 协议的消息中间件,最初起源于金融系统,用于在分布式系统中存储转发消息。RabbitMQ 发展到今天,被越来越多的人认可,这和它在可靠性、可用性、扩展性、功能丰富等方面的卓越表现是分不开的。

3c4300ba862a032b3e9f96e2d8b49cd3.jpeg

特点

  • 可靠性(Reliablity):使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
  • 灵活的路由(Flexible Routing):在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
  • 消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 高可用(Highly Avaliable Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  • 多种协议(Multi-protocol):支持多种消息队列协议,如STOMP、MQTT等。
  • 多种语言客户端(Many Clients):几乎支持所有常用语言,比如Java、.NET、Ruby等。
  • 管理界面(Management UI):提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
  • 跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
  • 插件机制(Plugin System):提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。

架构

基本概念

  • Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息的载体,每个消息都会被投到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
  • Producer:消息生产者,就是投递消息的程序.
  • Consumer:消息消费者,就是接受消息的程序.
  • Channel:消息通道,在客户端的每个连接里,可建立多个channel.


整体架构

消息生产者并没有直接将消息发送给消息队列,而是通过建立与Exchange的Channel,将消息发送给Exchange,Exchange根据规则,将消息转发给指定的消息队列。消费者通过建立与消息队列相连的Channel,从消息队列中获取消息。

71a1d6f56cbdf0982c68b8337eba1c5a.jpeg



运行流程

首先生产者将业务方数据进行可能的包装,之后封装成消息,发送到 Broker 中。消费者订阅并接收消息,经过可能的解包处理得到原始的数据,之后再进行业务处理逻辑。这个业务处理逻辑并不一定需要和接收消息的逻辑使用同一个线程。消费者可以使用一个线程去接收消息,存入到内存中,比如使用 Java 中的 BlockingQueue。业务处理逻辑使用另一个线程从内存中读取数据,这样可以将应用进一步解耦,提高整个应用的处理效率。

377ac2032b72d497dcf96666a2b5c694.jpeg


交换机类型

  • Direct Exchange 直连交换机:发送消息到直连类型的交换机时,只有routing key跟binding key完全匹配时,绑定的队列才能收到消息。
  • Topic Exchange 主题交换机:发送消息到主题类型的交换机时,routing key符合binding key的模式时,绑定的队列才能收到消息。主题类型的交换机与一个队列绑定时,可以指定按模式匹配的routing key。通配符有两个,*代表匹配一个单词。#代表匹配零个或者多个单词。单词与单词之间用 . 隔开
  • Fanout Exchange 广播交换机:当消息发送到广播类型的交换机时,不需要指定routing key,所有与之绑定的队列都能收到消息。
  • Header Exchange 头交换机 :headers与direct的模式不同,不是使用routingkey去做绑定。而是通过消息headers的键值对匹配


RocketMQ

介绍

RocketMQ 是阿里巴巴是基于JMS的开源的分布式消息中间件,2016年底贡献给Apache,成为了Apache的一个顶级项目,基于高可用分布式集群技术,提供消息订阅和发布、消息轨迹查询以及定时(延时)消息、资源统计、监控报警等一系列消息云服务,是企业级互联网架构的核心产品。消息队列RocktMQ历史超过9年,为分布式应用系统提供异步解耦、削峰填谷的能力,同时具备海量消息堆积,高吞吐、可靠重试等互联网应用所需的特性,是阿里巴巴双11使用的核心产品。

d133df80df3dd5fe919d4f0d63aab909.jpeg

特点

  • 多协议支持:支持HTTP协议、TCP协议、STOMP协议
  • 事务消息:实现类似 X/open XA的分布事务功能,以达到事务最终一致性状态。
  • 定时(延时)消息:允许消息生产者指定消息进行定时(延时)投递,最长支持40天
  • 大消息: 支持最大4MB消息
  • 轨迹消息: 通过消息轨迹,能清晰定位消息从发布者发出,经由消息队列RocketMQ服务端,投递给消息订阅者的完整链路,方便定位排查问题
  • 广播消费:允许同一个Group ID所标识的所有consumer都各自消费某条消息一次。
  • 顺序消息:允许消息消费者按照消息发送的顺序对消息进行消费。
  • 重置消费进度:根据时间重置消费进度,允许用户进行消息回溯或者丢弃堆积消息。
  • 死信队列:将无法正常消费的消息存储到特殊的死信队列供后续处理
  • 全球消息路由:用于全球不同地域之间的消息同步复制,保证地域之间的数据一致性。

架构

基本概念

  • Name Server : 它是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
  • Broker:Broker部署相对复杂, Broker分为Master与Slave, 一个Master可以对应多个Salve, 但是一个Slave只能对应一个Master, Master与Slave的对应关系通过指定相同的BrokerName和不同的BrokerId来定义,BrokerId为0表示Master, 非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有的Name Server。
  • Consumer:Consumer与Name Server集群中的一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server获取Topic路由信息,并向提供Topic的Master、Slave建立长连接,且定时向Master、Slave发送心跳。
  • Producer:Producer与Name Server集群中的其中一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立连接,且定时向Master发送心
0bcc64c9b491abcffb5be5d8986f7ced.jpeg


存储模型

RocketMQ中的消息数据存储,采用了零拷贝技术,RocketMQ的消息的存储是由ConsumeQueue和CommitLog 配合来完成的,ConsumeQueue中只存储很少的数据,消息主体都是通过CommitLog来进行读写。

  • CommitLog:是消息主体以及元数据的存储主体,对CommitLog建立一个ConsumeQueue,每个ConsumeQueue对应一个(概念模型中的)MessageQueue,所以只要有Commit Log在,Consume Queue即使数据丢失,仍然可以恢复出来。
  • Consume Queue:是一个消息的逻辑队列,存储了这个Queue在CommitLog中的起始offset,log大小和MessageTag的hashCode。每个Topic下的每个Queue都有一个对应的ConsumerQueue文件,例如Topic中有三个队列,每个队列中的消息索引都会有一个编号,编号从0开始,往上递增。并由此一个位点offset的概念,有了这个概念,就可以对Consumer端的消费情况进行队列定义。

RocketMQ 为了提高性能,会尽可能地保证 磁盘的顺序写。消息在通过 Producer 写入 RocketMQ 的时候,有两种写磁盘方式,分别是同步刷盘与异步刷盘。

  • 同步刷盘:在返回写成功状态时,消息已经被写入磁盘 。具体流程是:消息写入内存的 PAGECACHE 后,立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态 。
  • 异步刷盘:在返回写成功状态时,消息可能只是被写入了内存的 PAGECACHE,写操作的返回快,吞吐量大当内存里的消息量积累到一定程度时,统一触发写磁盘动作,快速写入。


总结

RabbitMQ是基于AMQP 协议的 具有跨语言的特性,支持多种开发语言,基于erlang语言编写,天生具有高并发,RocketMQ是基于JMS的 是阿里巴巴旗下开发的mq,只能用java语言,声称可用性极高,消息从来不会丢失数据可靠性RabbitMQ具备多副本机制,数据可靠性较高,RocketMQ支持异步实时刷盘,同步刷盘,同步Replication,异步Replication,可用性方面。RabbitMQ支持集群部署,集群节点数量有多种规格。RocketMQ是分布式架构,可用性高。RabbitMQ不支持延迟队列(定时消息)、消息过滤、消息回溯、消息保留。

62a6992b8abd06ff904019ab3510d400.jpeg

e222531657528ceb1b7976441dc79592.jpeg



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值