消息队列介绍与对比

这篇具有很好参考价值的文章主要介绍了消息队列介绍与对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        消息队列不是什么新鲜玩意了,网上也是一大堆消息队列的介绍。本文只记录自己消息队列的使用过程,和自己总结的消息队列的对比。

        消息队列广泛应用主要得益于如下特性:

        1、非实时性。一些业务并不需要实时处理;

        2、异步。不需要同步进行处理不同业务,可异步去处理;

        3、解耦。将不同业务进行分离,生产者和消费者相互独立。

        4、流量削峰,限流缓解高并发。比如在秒杀中,经常会用到消息队列进行排队,缓解高并发压力。

        市面上开源的消息有很多,我最早接触的是RabbitMQ,因为当时自己网站用了celery,其内部就是使用了RabbitMQ,后来在2018年要换工作,去小米之前接触了golang的nsq,进入小米之后又开始使用了Kafka,过了两年,业务系统全部换成RocketMQ。就这样,我几乎把比较著名的消息队列都使用了一遍。总结一下我使用的场景:

       RabbitMQ:Celery,用于任务发布和消费执行,在我个人网站有充分应用;

       Kafka:早期小米有品订单支付后发送通知给小米OC,后期只使用Kafka做日志传输;

      NSQ:这个我纯粹是从学习的角度熟悉的,没有在实际工作中使用;

      RocketMQ:这个应该是我在实际工作中使用最多的,当年在小米几乎所有业务系统都使用RocketMQ作为唯一的业务消息中间件。

       Notify:这个是小米自研的,我们最早用过一段时间,说实话,我不是贬低他,但性能差得远了,最早版本是使用Mysql实现的,后来还是要借助RocketMQ,也就是说本身没什么意义了。 

     当我们在写业务中,如何做技术选型还是要因地制宜,从实际业务场景去出发,而不是一概而论。因为每个消息队列都有其特性,都会侧重其中某些方面。就像在小米时后来都选用RocketMQ时因为其更适用于我们电商的场景,其支持消息延迟、定时、半事务消息等等。而并不是说其他的不好。我现单位的EDA也是基于RocketMQ开发的。

        那做消息队列选型,就要从以下几个维度去考虑:

  • 消息顺序
  • 消息重复/消息幂等
  • 消息丢失
  • 消息事务
  • 消息延迟
  • 消费优先级
  • 消费持久化
  • 消息回溯  

          举个例子,如果对消息的丢失很看重,就一定注意持久化的问题。我们知道RabbitMQ的队列默认是auto-delete的,如果服务器重启了,队列都没了。我现单位就有一个项目组使用了RabbitMQ就出现了这个问题,服务器down掉后,重启后导致之前需要发送的消息全部丢失,这就是对消息队列不熟悉导致的。

类型

RocketMQ

Kafka

Rabbitmq

消息重复/幂等

不保证消息重复,需要在消费端自行实现。

早期版本不保证消息重复,需要在消费端自行实现。自从0.11.0.0之后,可实现生产消息不重复,Exactly Once。小米之前还发了一个基于Kafka的Talos,实际上也是通过生成唯一id保证的。

不保证消息重复,需要在消费端自行实现

消息持久化

支持,持久化到文件

RocketMQ的文件是存在commitLog,顺序写,通过mmap零拷贝技术提升读写性能,当然也有一个Index File索引文件,这个和Kafka差不多的

支持,持久化到文件。和RocketMQ的定长文件不同,Kafka的文件分区存储。

需要配置队列和消息的持久化。

消息丢失

可以保证at least once ,因此不会丢失。

在生产端,只有broker回复SUCCESS,生产端才为投递成功;

在消费端,只有回传SUCCESS给broker,才被认为消费成功。

当然,发送模式应该是同步活异步,如果发送模式选择oneway则不保证。

但有一种情况可能出现丢失:broker集群收到消息了,但是采用异步刷盘的话,可能在落盘之前,整个集群都挂掉了,当然发生概率会很低。

同理,也可保证消息不丢失。其实RocketMQ也是参考kafka来实现的。同样在生产消息以及消费消息的过程都会有确认机制。

可以保证不丢失

但是 队列和消息都要配置持久化,否则只在内存中,还是有可能丢失的。

消息顺序

在同一个逻辑队列中,可以实现消息的顺序。全局也可以,但是效率较差。

当使用顺序消息时,消费端同样要改成顺序消费,其默认是并发消费,即会同时开多个线程并发消费。

同一个partition下的可以实现消息顺序。

同理,将要顺序消费的消息放在一个Queue

消息延迟

支持延迟,延迟实现的方式(开源版)是设置不同级别的延迟队列,队列中通过定时去处理到期消息,其共有18个级别的定时。

在到时之前投递在一个专门的TOPIC下。

这个地方,小米后来是借助滴滴方式实现了任意时间的延迟。

这里要说一下,商业版是支持任意时间,嗯,阿里很会玩儿。

不支持。但内部通过时间轮实现了定时任务,不对外提供相应功能。

本身不支持,但可通过延迟插件或者死信队列方式实现。可以访问下面的参考资料

消息回溯

由于最后文件是写到磁盘文件,是支持消息回溯的。但过期删除的查看不了,一般上可配置7天或一个月。

支持回溯,支持按照offset和timestamp两种维度进行回溯。

不支持,当消息被消费之后,就会被删除。

消息事务

支持在生产者和broker之间的半事务。具体流程可参考官网。简单说就是通过双方的commit,以及事务状态回查来实现。

在事务完全提交之前,是个半事务消息,也不会消费。

自0.11开始,kafka就支持了事务。但这个事务和RocketMQ的事务不是一回事,RocketMQ强调分布式事务的场景。Kafka强调的是一次发多个消息的事务特性。即多个消息要么都成功,要么都失败。

虽然Rabbitmq事务机制,但感觉其并非为了支持分布式事务,而只是一种支持At least once的保证机制。

消费重试

集群模式下,如果未成功消费,可以重试,超过一定次数进入死信队列;

广播模式下,不支持重试。

不支持。和RocketMQ不同,kafka不需要消费者提供消费ack,而且不自动维护偏移量,只是提供偏移量更新接口。不过可以根据这个特性实现自动重试。

支持。默认支持消费端的确认机制。

消费分组

支持消费分组

支持消费分组

不支持,一个消息只能被一个消费者消费

高可用

设置NameServer集群,每个节点都会存储全部的路由和topic信息。

broker集群:多master+多slave

且 broker有专门负责master到slave的同步

集群部署,早期使用ZK管理。后期自实现KRaft进行集群管理。

有主队列和镜像队列,可以保证高可用。但要特别注意集群内的节点同步只同步队列元数据,不同步队列数据本身,RabbitMQ主要是基于性能考虑。

高性能

通过顺序IO、零拷贝mmap)、PageCache、分区、索引文件等多种方式来实现高可用。

支持消费端多线程并发消费。

通过顺序IO、零拷贝(sendfile)、PageCache、分区、索引文件等多种方式来实现高性能

性能一般,主要其采用Push模式文章来源地址https://www.toymoban.com/news/detail-806935.html

到了这里,关于消息队列介绍与对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MQ公共特性介绍 (ActiveMQ, RabbitMQ, RocketMQ, Kafka对比)

    本文主要介绍所有MQ框架都具备的公共特点,同时对比了一些目前比较主流MQ框架的优缺点,给大家做技术选型作参考。 MQ,MessageQueue,消息中间件 从世界上第一个MQ的诞生历程来看,它最初是为了解决通信的问题。 消息队列,又叫做消息中间件。是指用高效可靠的消息传递

    2024年02月15日
    浏览(36)
  • 消息队列之六脉神剑:RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用

    消息队列(Message Queue)是一种异步通信机制,它将消息发送者和接收者解耦,从而提高了应用程序的性能、可扩展性和可靠性。在分布式系统中,消息队列经常被用于处理高并发、异步处理、应用解耦等场景。 本篇回答将分析比较常见的六种消息队列:RabbitMQ、Kafka、Active

    2024年02月14日
    浏览(34)
  • 消息队列RocketMQ、Kafka小计

    点对点模式 (一对一,消费者主动拉取数据,消息收到后消息清除)点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端。这个模型的特点是发送到队列的消息被一个且只有一个接收者接收处理,即使有多个消息

    2023年04月22日
    浏览(24)
  • 【技术选型】ActiveMQ、RocketMQ、RabbitMQ、Kafka对比

    MQ(Message Queue),即消息队列。早已成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的MQ,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。

    2024年02月13日
    浏览(29)
  • RabbitMQ、Kafka、RocketMQ:特点和适用场景对比

    在现代分布式系统中,消息队列是一种常见的架构模式,用于实现异步通信和解耦应用组件。RabbitMQ、Kafka和RocketMQ是当前流行的开源消息队列系统,它们各自有着独特的特点和适用场景。本文将对这三种消息队列系统进行详细介绍,并对它们的特点和适用场景进行对比分析。

    2024年02月11日
    浏览(29)
  • Kafka、RabbitMQ、RocketMQ中间件的对比

    消息中间件现在有不少,网上很多文章都对其做过对比,在这我对其做进一步总结与整理。     RocketMQ 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,201

    2024年02月05日
    浏览(26)
  • mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ

    十几年前,淘宝的notify,借鉴ActiveMQ。京东的ActiveMQ集群几百台,后面改成JMQ。 Linkedin的kafka,因为是scala,国内很多人不熟。淘宝的人把kafka用java写了一遍,取名metaq,后来再改名RocketMQ。 总的来说,三大原因,语言、潮流、生态。 MQ这种东西,当你的消息量不大的时候,用啥

    2024年02月12日
    浏览(37)
  • MQ对比选型:RocketMQ、Kafka、RabbitMQ、ActiveMQ、ZeroMQ

    本文将从多个角度全方位对比目前比较常用的几个MQ: RocketMQ Kafka RabbitMQ ActiveMQ ZeroMQ下文单独说明。 特性 RocketMQ Kafka RabbitMQ ActiveMQ 单机吞吐量 10 万级,支撑高吞吐 10 万级以上,甚至有文献称,可以达到单机百万级TPS。 万级,同ActiveMQ 万级,相对其他MQ较低。 topic 数量对吞

    2024年04月27日
    浏览(31)
  • Kafka、RocketMQ、RabbitMQ如何保证消息的顺序消费?

    一、1个Topic(主题)只创建1个Partition (分区),这样生产者的所有数据都发送到了一个Partition (分区),保证了消息的消费顺序; 二、生产者在发送消息的时候指定要发送到哪个 Partition,这样同一个 Partition 的数据会被同一个消费者消费,从而保证了消息的消费顺序。 实现思路

    2024年02月09日
    浏览(34)
  • 【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka

    作者简介 前言 博主之前写过一个完整的MQ系列,包含RabbitMQ、RocketMQ、Kafka,从安装使用到底层机制、原理。专栏地址: https://blog.csdn.net/joker_zjn/category_12142400.html?spm=1001.2014.3001.5482 本文是该系列的清单综述,会拉通来聊一下三大MQ的特点和各种适合的场景。 目录 1.概述 1.1.M

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包