又老性能又差,为什么好多公司依然选择 RabbitMQ?

大家好,我是君哥。

RabbitMQ 这个消息队列相信很多程序员都用过,我第一次使用是在 2016 年,确实是一个老牌的消息队列了,但是为什么一直没有被淘汰呢?今天来聊一聊这个话题。

老旧差

发布历史

为什么说 RabbitMQ 老呢?下图是 RabbitMQ 最早的发布记录,可以看到 RabbitMQ 在 2007 年已经发布,已经有 16 年多的使用历史了。

图片

小众

为什么说 RabbitMQ 比较小众呢?

一方面 RabbitMQ 使用 Erlang 语言编写,这是一个比较小众的编程语言,学习成本非常高,不像 Java、Scala、C 等编程语言学起来简单。所以虽然 RabbitMQ 也是开源的消息队列,但基于 RabbitMQ 做扩展和二次开发的情况是很少。

另一方面从使用的协议来看,RabbitMQ 支持 AMQP(Advanced Message Queuing Protocol) 协议,这也是主流消息队列不支持的。

AMQP 协议如下图:

图片

有几个概念介绍一下:

  • Connection:一个网络连接,AMQP 协议通常使用长连接;

  • Channel:网络信道,建立在 Connection 之上的轻量级的连接,一个 Connection 可以有多个 Channel;

  • Exchange:交换器,接收消息后将消息路由转发给绑定(Binding)的 Queue;

  • Binding:Exchange 和 Queue 之间的虚拟连接;

  • Routing Key:这个概念在图中没有画,是指路由规则,用来确定 Exchange 将消息路由到哪些 Queue。

可以看到,好多概念在主流的消息队列比如 Kafka、RocketMQ 是没有的,所以说 RabbitMQ 比较小众。

性能差

在底层消息持久化的方式上,RabbitMQ 并没有使用 MMAP、Sendfile 等零拷贝技术,这是性能差的一个重要原因。

在架构上,RabbitMQ 提供了镜像队列来做 Master 的备份。如下图:

图片

无论生产者发送消息,还是消费者拉取消息,如果请求发送到镜像队列,则镜像队列需要把请求转发到 Master 进行处理,Master 处理后再把结果回复给镜像节点,镜像队列回复给请求者。

在特定硬件环境下,RabbitMQ 支持的消息吞吐量在万级~十万级,相比 RocketMQ 的十万级~百万级和 Kafka 的百万级以上,吞吐量还是差一些。

受欢迎

从我过往的公司、身边的一些朋友、面试过的候选人简历可以看出,好多公司消息队列技术选型时选择了 RabbitMQ,这跟 RabbitMQ 老旧和性能差形成鲜明对比。

RabbitMQ 为什么这么受欢迎呢?

持续更新

虽然 RabbitMQ 老旧,但是并没有停止更新,而且更新还挺频繁,下图是 2023 年最近发布的几个版本:

图片

从 2007 年开始,RabbitMQ 已经有 16 年的使用历史,可以称得上是一个久经考验的战士,各种问题已经修复,学习资料丰富,性能稳定。

运维简单

RabbitMQ 是一个非常轻量级的消息队列,官方宣称开箱即用。在 Docker 上部署 RabbitMQ,三个命令就可以。

  1. 拉取镜像

docker pull rabbitmq:3.8.2-management
  1. 创建路径

mkdir /var/lib/rabbitmq
  1. 启动容器

docker run -d --name rabbitmq3.8.2 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --privileged=true

这种开箱即用的效果,大大降低了学习成本和运维成本。

灵活路由

依托于 AMQP 中的 Exchange,RabbitMQ 提供了灵活的路由配置,有 4 种。

  1. Direct Exchange

生产者将消息发送给 Exchange 后,Exchange 通过 Routing Key 把消息路由到对应的队列。如下图(来自官网):

图片

  1. Fanout Exchange

生产者将消息发送给 Exchange 后,Exchange 将消息路由到所有绑定的队列,类似于广播模式。如下图(来自官网):

图片

  1. Topic Exchange

这种路由策略首先定义一个 Topic,topic 中可以包含 * 和 #* 可以代表一个单词,# 可以代表 0 或多个单词。如下图(来自官网):

图片

图中 Topic 由三个单词<celerity>.<colour>.<species>组成,分别代表特征、颜色和物种,单词之间用.间隔。这样 Q1 将接收颜色为 orange 的所有消息,Q2 将接收物种为 rabbit 的消息和特征为 lazy 的消息。

  1. Headers Exchange

这种路由策略要求消息中需要携带 Headers(类似 Http 中的消息头),队列跟 Routing Key 绑定时也要定义一个 Headers,只有绑定中定义的 Headers 跟消息中的 Header 匹配,才会路由到相应的队列。匹配规则有两种:

  • ALL:要求两个 Headers 中所有 key 和 value 匹配;

  • ANY:要求两个 Headers 任何一个 key 和 value 匹配。

如下图:

图片

这种路由方式在定义绑定关系的时候就需要定义 Headers,如下代码:

@Bean
public Binding binding1(HeadersExchange headersExchange,Queue queue1){
 HashMap<String, Object> headers = new HashMap<>();
 headers.put("key1","aaa");
 headers.put("key2","bbb");
 return BindingBuilder.bind(queue1).to(headersExchange).whereAll(headers).match();
}

public Binding binding2(HeadersExchange headersExchange,Queue queue2){
 HashMap<String, Object> headers = new HashMap<>();
 headers.put("key1","aaa");
 headers.put("key2","bbb");
 return BindingBuilder.bind(queue2).to(headersExchange).whereAny(headers).match();
}

客户端丰富

RabbitMQ 客户端支持的编程语言是消息队列中最多的,很容易兼容自己系统使用的编程语言。参考下图(来自官网):

图片

总结

RabbitMQ 虽然老旧,但具有运维简单、灵活路由、客户端丰富等特性。虽然吞吐量不高,但性能足够满足中小企业的使用需求。这让 RabbitMQ 成为非常受欢迎的消息队列。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML---浮动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.常见的网页布局 二.标准文档流 标准文档流常见标签 标准文档流的组成 块级元素<div…

青少年CTF-qsnctf-A1-Misc-签到

题目环境&#xff1a; 题目难度&#xff1a;★题目描述&#xff1a;有没有可能&#xff0c;这个平台就是个题目&#xff1f; 一道杂项题 题目说的是这个平台就是题目 那么也就是说flag就在这个平台里面1.从高层次向低层次逐一排查 2.首先对平台首页进行排查进平台首页 第一种解…

了解树和学习二叉树

1.树 1.1 概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 注意&#xff1a;树形结构中…

什么是数据资产化?数据怎样成为资产?怎样进入资产负债表?

财政部发布的《企业数据资源相关会计处理暂行规定》将从2024年1月1日起开始实施&#xff0c;为企业数据资源入表提供了基本指引&#xff0c;数据资产化有望迎来爆发期。什么是数据资产化&#xff0c;怎样让数据成为资产&#xff0c;成为了众多国有企业、上市公司关心的问题。 —…

「Vue3面试系列」Vue3.0性能提升主要是通过哪几方面体现的?

文章目录 一、编译阶段diff算法优化静态提升事件监听缓存SSR优化 二、源码体积三、响应式系统参考文献 一、编译阶段 回顾Vue2&#xff0c;我们知道每个组件实例都对应一个 watcher 实例&#xff0c;它会在组件渲染的过程中把用到的数据property记录为依赖&#xff0c;当依赖发…

C语言学习NO.10-指针(二)数组名的理解,使用指针访问数组,一维数组传参的本质,冒泡排序,二级指针,指针数组,指针数组模拟二维数组

一、数组名的理解 //使用指针访问数组的内容 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int* p &arr[0]; 这里我们使用&arr[0]的方式拿到了数组第一个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;而且是数组首元素的地址。 #include <stdio.h>…

全国“兽医”专业大学生知识竞赛策划方案

一、初赛&#xff1a;参赛者通过网络平台进行答题。 各校大学生均可在“大赛官网”登录&#xff0c;填写真实姓名、学校、联系方式、身份证号、学号等信息&#xff0c;即可答题参赛。 系统将随机从题库中抽取50道题&#xff0c;满分100分&#xff0c;其中&#xff0c;单选题20…

Prometheus API 使用介绍|收藏

​ &#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试…

通过windows cng api 实现rsa非对称加密

参考&#xff1a; 1,使用 CNG 加密数据 - Win32 apps | Microsoft Learn 2,不记得了 &#xff08;下文通过cng api演示rsa加密&#xff0c;不做原理性介绍&#xff09; 相对于aes等对称加密算法&#xff0c;rsa加密算法不可逆性更强。非对称加密在通常情况下&#xff0c;使…

STM32烧录口锁死问题解决

前言 我在给STM32单片机下载程序时&#xff0c;出现下载成功一次后&#xff0c;后面就下载不了了&#xff0c;识别不到下载器设备&#xff0c;经过排查&#xff0c;最终确认是代码配置有误&#xff0c;导致板子烧录口锁死&#xff0c;下面我将把问题的出现到问题的解决进行复现…

LZ码基本概念

LZ码是一种无损压缩算法&#xff0c;由Lempel和Ziv两位计算机科学家提出并命名。它是一种基于字典的压缩方法&#xff0c;可以将数据有效地压缩存储&#xff0c;同时实现高效的解压缩。 LZ码的基本概念是利用字典来存储先前遇到的字符串&#xff0c;然后用较短的代表符号来表示…

R软件包ConsensusCluster进行共识聚类(Consensus Clustering)

从下面论文看到这个方法&#xff1a; Wang, Xin, et al. "Deep learning using bulk RNA-seq data expands cell landscape identification in tumor microenvironment." Oncoimmunology 11.1 (2022): 2043662. 这篇论文基于 AI 方法对 bulk RNA-seq 数据识别肿瘤微环…

2023年12月GESP Python五级编程题真题解析

【五级编程题1】 【试题名称】&#xff1a;小杨的幸运数 【问题描述】 小杨认为&#xff0c;所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运数。自然地&#xff0c;小杨的所有超级幸运数也都是幸运数。 对于一个…

AI 视频 | 又一款 AI 视频工具火爆全网!DomoAI 实测体验如何?

一、引言 前几期介绍了几款常用的 AI 视频工具&#xff1a;Moonvalley、Runway Gen-2、Stable Video Diffusion&#xff0c;NeverEnds&#xff0c;对 AI 视频工具感兴趣的小伙伴可以移步之前的几篇文章。 程序员X小鹿&#xff1a;【AI视频】免费的 AI 视频生成工具 Moonvalley…

纯搬运 solidworks 2021卸载方法,怎么完全彻底卸载删除清理干净solidworks 2021各种残留注册表和文件?

纯搬运 solidworks 2021卸载方法&#xff0c;怎么完全彻底卸载删除清理干净solidworks 2021各种残留注册表和文件&#xff1f; 网址&#xff1a; solidworks 2021卸载方法&#xff0c;怎么完全彻底卸载删除清理干净solidworks 2021各种残留注册表和文件&#xff1f; solidworks…

js显示实时时间

文章目录 一、效果二、思路三、最后 一、效果 用JS实现XXXX年XX月XX日 星期X XX时XX分XX秒 效果 效果 &#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>time</title><script t…

基于Java SSM框架实现在线课程教育资源考试管理系统项目【项目源码+论文说明】

基于java的SSM框架实现在线课程教育资源考试管理系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线教育资源管理系统&#xff0c;主要的模块包括管理员&#xff1b;个人中心、学生…

Android wifi基础知识点

1、什么是 CSMA/CA &#xff1f; 以太网用 CSMA/CD 进行传输控制&#xff0c;而 IEEE 802.11 的 WLAN 采用的是 CSMA/CA 。 CSMA/CD &#xff0c;全称 Carrier Sense Multiple Access with Collision Detection &#xff0c;即 载波侦听多路访问/冲突检测协议。 载波侦听(Ca…

Python课程设计-图书管理系统

Python课程设计-图书管理系统 摘要第一章 绪论1.1 开发环境及技术1.2 系统实现功能描述 第二章 功能详细设计与实现2.1 系统框架各层次实现2.1.1 可视页面设计2 数据库设计3 逻辑流程设计 2.2 主要功能的设计与实现1 功能 1用户登录2 功能 2展示图书3 功能 3添加图书4 功能 4删…

个性化邮件营销策略:提升销售额的有效方法

事实上&#xff0c;电子邮件营销人员一直将个性化视为让受众产生强烈参与感的最佳方式之一。对于很多营销人员来说&#xff0c;实施个性化甚至不再是一种选择&#xff0c;而是培养和吸引潜在客户和联系人的必要条件。因此&#xff0c;今天我们将一起来讨论一些成功电子邮件营销…