消息队列选型——为什么选择RabbitMQ

news2024/9/22 21:20:18

前言

MQ消息是目前分布式系统必不可少的组件,但是面对市面上众多的MQ组件,我们该用什么呢?我以实际项目的需求触发,介绍今天的主角——rabbitMQ。同时也会告知又有哪些优势和不足。事不宜迟,就开始今天的学习吧

目录

一、MQ及MQ组件

1. MQ的解释与用处

2. 几款常用的MQ框架简介

二、RabbitMQ的特点

1. RabbitMQ的模型与优势 

2. 与kafka的对比

3. 为什么选择RabbitMQ?

4. 不可避免的弊端


一、MQ及MQ组件

1. MQ的解释与用处

如果你已经对MQ有所了解,想必对其用途已经了然于胸了。如果你仅仅是听说过,或许可以直白的描述它,它就相当于日常生活中的社交软件的消息,可以通过它把信息发给对方。特点是不如电话那么及时,但可以群发,即使对方不在线,等其上线照样可以获得该信息。当然,从架构角度消息归纳起来有以下几种好处

  1. 解耦应用程序: 使用MQ,应用程序之间可以通过中间件进行通信,这样应用程序之间的连接就成为松散的,即使一方出现问题也不会影响其他应用程序的正常运行

  2. 提高系统可靠性:MQ允许将消息存储在队列中,这样如果一个应用程序出现故障,消息也不会丢失。在应用程序恢复正常运行后,它可以从队列中读取并处理这些消息。

  3. 增加系统伸缩性:MQ允许多个应用程序同时访问同一个队列,这样就可以轻松地添加更多消费者来处理消息,从而实现水平扩展

  4. 支持异步处理:使用MQ,发送者可以异步发送消息到队列中,接收者可以在自己的时间内获取并处理这些消息,从而提高系统的性能和响应速度。

  5. 支持多种协议和消息格式:MQ支持多种协议和消息格式,如AMQP、JMS、Kafka等,可根据需要选择合适的协议和格式。

2. 几款常用的MQ框架简介

除了我们今天的主角rabbitMQ,目前市面上还有几款消息中间件是比较流行的,如ActiveMQApache Kafka、以及阿里的RocketMQ,我们以一张简表速览一下

特性

ActiveMQ

RabbitMQ

RocketMQ

kafka

开发语言

java

erlang

java

scala

单机吞吐量

万级

万级

10万级

10万级

时效性

ms级

us级

ms级

ms级以内

可用性

高(主从架构)

高(主从架构)

非常高(分布式架构)

非常高(分布式架构)

功能特性

成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好

基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富

MQ功能比较完备,扩展性佳

只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。

上述四种是最常用的MQ组件了,当然一个工程,根据要求可以同时运用多种框架,毕竟框架之间使用场景有所差异。


二、RabbitMQ的特点


1. RabbitMQ的模型与优势 

我们先来看看RabbitMQ的模型图,其主要有交换机(Exchange)队列(Queue)两个组件构成。然后通过绑定路由配置来实现多种传递方式,可以说功能十分强大

更具体的说,其具备以下特点:

  1. AMQP支持:RabbitMQ 实现了 AMQP,这是一个强大的开放标准消息协议,支持多语言和平台。
  2. 可靠性:RabbitMQ 提供了丰富的特性来保证消息的可靠性,包括消息确认、持久化、镜像队列、备份队列等。
  3. 灵活性:RabbitMQ 支持多种消息模式,如点对点、发布/订阅、任务队列、RPC等,满足各种应用场景的需求
  4. 扩展性:RabbitMQ 拥有分布式架构,支持高可用和集群部署,可以实现水平和垂直扩展
  5. 监控和管理:RabbitMQ 提供了 web 控制台和命令行工具,方便用户对队列状态进行监控和管理。
  6. 社区支持:RabbitMQ 的用户社区非常活跃,提供了大量的文档和教程,有问题可以很快得到解决

2. 与kafka的对比

kafka严格的讲,并不是一款MQ框架,也没有实现 AMQP 协议。更确切的说,kafka是一款分布式流处理平台,以高吞吐量、低延迟和可靠性为特点,适用于大规模数据处理和实时数据集成,但我们仍然可以把它作为一种消息中间件来使用,我们来看下它与rabbitMQ的详细对比:

对比项

kafka

rabbitmq

单机吞吐量

10万级

万级

时效性

ms级以内

us级(微秒级)

是否支持消息回溯

支持消息回溯,因为消息持久化,消息被消费后会记录offset和timstamp

不支持,消息确认被消费后,会被删除

是否支持消息数据持久化

支持消息数据持久

支持消息数据持久

优先级队列

不支持

支持。建议优先级大小设置在0-10之间。

延迟队列

不支持

支持

重试队列

不支持。

不支持RabbitMQ中可以参考延迟队列实现一个重试队列,二次封装比较简单。如果要在Kafka中实现重试队列,首先得实现延迟队列的功能,相对比较复杂。

是否支持消息堆积

支持消息堆积,并批量持久化到磁盘

支持阈值内的消息对接,无法支持较大的消息堆积

是否支持流量控制

支持控制用户和客户端流量

支持生产者的流量控制

开发语言

scala,Java

erlang

是否支持多租户

2.x.x支持多租户

支持多租户

是否支持topic优先级

不支持

支持

是否支持消息全局有序

不支持

支持

是否支持消息分区有序

支持

支持

是否内置监控

无内置监控

内置监控

是否支持多个生产者

一个topic支持多个生产者

是否支持多个消费者

一个topic支持多个消费者

是否支持一个分区多个消费者

不支持

不支持

是否支持JMX

支持

不支持(非java语言编写)

是否支持加密

支持

支持

消息队列协议支持

仅支持自定义协议

支持AMQP、MQTT、STOMP协议

客户端语言支持

支持多语言客户端

支持多语言客户端

是否支持消息追踪

不支持消息追踪

支持消息追踪

是否支持消费者推/拉模式

拉模式

推模式+拉模式

是否支持广播消息

支持广播消息

支持广播消息

元数据管理

通过zookeeper进行管理

支持消息数据持久

默认服务端口

9200

5672

默认监控端口

kafka web console 9000;kafka manager 9000;

15672

网络开销

相对较小

相对较大

内存消耗

相对较小

相对较大

cpu消耗

相对较大

相对较小

3. 为什么选择RabbitMQ?

什么时候才能选rabbitMQ作为自己系统的中间件呢?我可以举一个实例

我们系统在过去有大量的同步调用,而且因为下游的实现语言有很多种,有java、C# 、PHP等。所以同步调用其实采用的自研协议,但是同步调用加自研协议的性能,带来的一个问题就是链路很耗时,硬件利用率低,给用户的印象就是卡和延迟,因此急需缩短链路上的耗时,但因为承担的核心系统间的调用功能,所以业务的可靠性需要极高的保障,而且下游真的出现问题要能及时发现和通知。

针对这种场景,那么我们就需要一款消息组件来作为异步调用中转,而且该组件需要有可靠性。那么它应当有以下几种功能

  1. 消息可靠,要求消息全程都能有保障,消息能落在硬盘上
  2. 下游多语言的支持
  3. 对下游有容错,消息有自动重发能力。
  4. 支持一条消息被多个下游消费,且下游数量可随意增减
  5. 消息支持轮流消费和广播两种能力
  6. 有方便的管理界面,进行总体情况的查看
  7. 灵活的消息传递路径
  8. 社区活跃,有问题方便解决

其中有几种是MQ组件独有的能力,比如有消息重发的能力,这一点Kafka就得开发者自己去搞定了,所以kafka首先排除

然后是RocketMQ,RocketMQ其实顺序消息和实时性方面更加优秀,但一个是下游多语言,一个是社区活跃度就稍有不足了,尤其是rocketMQ目前仅支持java及c++,这一点是致命伤,所以用不了RocketMQ

同样的,ActiveMQ也是个成熟的项目,支持多语言而且功能完善,但也有问题,就是其界面支持比较弱。另外现在Apache的工作中心在其下一代Apollo,社区活跃度也下降了,所以ActiveMQ后续的长期维护肯定不方便的,被排除

如此一来,只剩一个水桶选择了,那就是rabbitMQ,它满足了我们需要种种功能,社区活跃度还高,支持多种模型和管理都是加分项,而且延迟很低

4. 不可避免的弊端

尽管我们最后选了RabbitMQ,但也不能忽视其存在的问题:

使用的学习成本:其基于AMQP的协议,有着交换机和队列及绑定操作,以及多种路由规则,并不是傻瓜式的上手就能掌握。

排查的成本,RabbitMQ的性能和可靠性是使用Erlang语言的结果,但这也使得它的维护成本较高,因为Erlang相对于其他编程语言使用较少,而且维护排查问题的成本较高

限制较多:RabbitMQ限制了消息的大小、队列数量、连接数量等,这可能在一些特定场景下对业务造成限制。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ghost cms配置qq邮箱

背景: 在ghost cms中使用qq邮箱作为注册、登录、订阅等邮件发送方。 1 修改配置 在config.*.json文件中,添加mail配置 "mail": {"from": "xxxxxxqq.com","transport": "SMTP","options"…

Qt6 FFmpeg入门1 - 环境配置

目录 环境配置ffmpeg 下载qt 配套环境配置代码测试 环境配置 文章更新时间:2023/06/24 ffmpeg 下载 由于大部分的关于配置 ffmpegqt 环境的文章都停留在 2021 年,且许多方法均已过时,现在介绍一个最新的方法,并分析槽点供大家参考…

ElementUI在对话框中新增数据,使用rules校验规则进行校验,再点击完修改之后,在进行新增校验会报错

1.新增与修改使用同一个对话框,当修改完成一条数据后,重新打开新增的对话框,通过ElementUI的rules检验会报错 解决方案:在对应的rules校验中每个字段添加trigger: blur 即可解决上述问题,注意:下面的xxx代表需要校验的…

设计模式-05.01-行为型-观察者模板

观察者模式【常用】 我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,…

工具篇7--RocketMq消息模型介绍

文章目录 前言:一、RocketMq是什么?二、RocketMq 模型介绍:1.RocketMq 模型图:2.RocketMq 生产者:2.1 生产者消费发送流程:2.2 生产者消息发送:2.2.1 同步发送普通消息:2.2.1 异步发…

AI大模型及算力要求

AI大模型对算力的要求非常高,需要高性能的硬件设备和分布式训练技术来支持。随着AI技术的不断发展,未来可能会出现更大、更复杂的模型,对算力的要求也将更高。今天和大家分享几个大模型及算力要求,希望对大家有所帮助。北京木奇移…

DETR系列:RT-DETR实战部署

上篇文章介绍RT-detr的论文内容(RT-DETR 论文解析),本篇文章介绍算法复现、tensorRT加速、python调用部署、训练等方法。 RT-DETR实战部署 1.复现模型详情2.环境准备3.训练4.部署5.测试 1.复现模型详情 本次复现主要测试下表中RT-DETR-R50和…

Kafka集群模式核心概念

文章目录 1.Kafka集群模式下Broker|主题|分区|副本的概念1.1.Broker|主题|分区|副本的概念1.2.创建一个Topic指定3个副本数1.3.多副本的Topic详细信息描述 2.集群模式下以消费者组消费Topic中各分区消息的概念2.1.分消费者组消费各分区的概念2.2.集群模式下消息的发送和消费 3.…

Go 语言中 Context 的作用和使用方法详解

KDP(数据服务平台)是一款由 KaiwuDB 独立自主研发的数据服务产品,以 KaiwuDB 为核心,面向 AIoT 场景打造的一站式数据服务平台,满足工业物联网、数字能源、车联网、智慧产业等行业核心业务场景下数据采集、处理、计算、…

在Azure SQL DB/Azure托管实例里快速查询各数据库大小以及每个数据库下表的大小

目录 (一)前言 (二)正文 1. 环境: 2. 查看实例下每个数据库的空间大小 (1) SQL语法 (2)运行结果 3. 查看特定数据库下每张表的大小 (1)SQ…

一个sql中的一张表,最多只会走一个索引吗

目录 先给结论 做实验 1.根据时间范围查询 什么是key_len? 2.根据时间范围和 is_delete 查询 最左匹配原则 2.根据时间范围和 blog_type 查询 如果加上id会怎么样 并不是索引一定会走 1.IN子表数量过多 2.单次查询超过30% 先给结论 先说结论,…

设计模式第14讲——享元模式(Flyweight)

目录 一、什么是享元模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 Bike——抽象享元类(FlyWeight) 5.2 具体享元类(ConcreteFlyWeight) 5.3 BikeFactory——享元…

layui框架学习(28:穿梭框模块)

Layui模块中的穿梭框模块transfer主要支撑穿梭框组件的显示、交互等操作。所谓穿梭框是指左右各有一个复选框列表,可以将左侧选中的项目移动到右边,后者将右侧的选中项移回左边的控件,其样式类似下图所示(参考文献5-6)…

TI AM62x工业开发板规格书(单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F,主频1.4GHz)

1 评估板简介 创龙科技TL62x-EVM是一款基于TI Sitara系列AM62x单/双/四核ARM Cortex-A53 单核ARM Cortex-M4F多核处理器设计的高性能低功耗工业评估板,由核心板和评估底板组成。处理器ARM Cortex-A53(64-bit)主处理单元主频高达1.4GHz,ARM Cortex-M4F实…

如何使用 Flink SQL 探索 GitHub 数据集|Flink-Learning 实战营

为进一步帮助开发者学习使用 Flink,Apache Flink 中文社区近期发起 Flink-Learning 实战营项目。本次实战营通过真实有趣的实战场景帮助开发者实操体验 Flink,课程包括实时数据接入、实时数据分析、实时数据应用的场景实。并结合小松鼠助教模式&#xff…

USR-C216 WIIF连接手机

复位后连接USR-C216无线 浏览器输入10.10.100.254 账号密码为admin 客户端模式服务器地址无效,默认就行 打开手机网络调试助手选择客户端模式,输入10.10.100.254,端口8899 可以透传了 关于AT指令,先发“”,然后3s内发…

【数据管理架构】什么是 OLTP?

OLTP(在线事务处理)支持在 ATM 和在线银行、收银机和电子商务以及我们每天与之交互的许多其他服务背后进行快速、准确的数据处理。 什么是 OLTP? OLTP 或在线事务处理允许大量人员(通常通过 Internet)实时执行大量数据…

基于Vue+Node.js的宠物领养网站的设计与开发-计算机毕设 附源码83352

基于VueNode.js的宠物领养网站的 摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络…

【国产FPGA应用】紫光Pango Design联合 Modelsim 仿真方法

Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具,主要用于验证数字电路设计是否正确。我们经常用Xilinx的ISE或者Vivado与Modelsim进行联合仿真,其实国产FPGA开发工具也可以与Modelsim进行联合仿真,对于设计比较复杂的应用还是非常方便的&am…

创邻科技与浪潮信息KOS完成澎湃技术认证

近日,浙江创邻科技有限公司(简称:创邻科技)自主研发的Galaxybase图数据库系统与浪潮信息服务器操作系统KOS V5完成澎湃技术认证。创邻科技作为国内首个成熟的商业图数据库供应商,在同类厂商中率先完成认证。测试结果显…