RabbitMQ、Kafka、RocketMQ三种消息中间件对比总结

news2024/10/4 15:32:42

文章目录

  • 前言
  • 侧重点
  • 架构模型
  • 消息通讯
  • 其他对比
  • 总结
  • 参考文档

前言

不论Kafka还是RabbitMQ和RocketMQ,作为消息中间件,其作用为应用解耦、异步通讯、流量削峰填谷等。
拿我之前参加的一个电商项目来说,订单消息通过MQ从订单系统到支付系统、库存系统等,当订单信息写入MQ后就不再关心后续操作,既达到了应用解耦又达到异步通信。因为订单的并发量较大,为了避免数据库承受不住,在订单信息持久化时通过MQ+定时任务将订单信息均匀的持久到数据库中,达到削峰填谷作用。
那为什么有这么多的MQ?这些MQ又有什么区别?

侧重点

每个MQ的侧重点不一样。

  • RabbitMQ
    RabbitMQ由以高性能、健壮以及可伸缩性出名的Erlang语言编写,在扩展或删除Rabbit服务节点时只需要同步erlang信息即可。另外rabbitmq在数据可靠性的问题上做了很大的努力,它保证在这里数据是非常可靠的。
  • Kafka
    Kafka由Scala和Java编写,与RabbitMQ不同,Kafka是一种高吞吐量的分布式消息中间件,其通过零拷贝、pagecahe技术以及分区的设计实现高吞吐,同时分区的设计也避免了消息存储瓶颈问题。
  • RocketMQ
    RocketMQ是阿里出品的,参考Kafka架构使用Java语言重新编写的一个消息中间件,弥补了Kafka的扩展性,在Kafka基础上扩展了多种消息模式,比如延迟消息、事务消息。

架构模型

  • RabbitMQ
    RabbitMQ基于AMQP协议实现,其模型如下:
    在这里插入图片描述

Kafka与RocketMQ架构类似,RocketMQ使用NameServer代替了Zookeeper,这一点我觉得对开发人员是比较友好的,少了一个组件。

  • Kafka
    在这里插入图片描述
  • RocketMQ
    在这里插入图片描述

消息通讯

  • RabbitMQ
    RabbitMQ支持发布订阅、Topic及RPC多种通讯方式,满足大部分消息通讯,并支持死信队列。另外,RabbitMQ的插件社区支持丰富的插件,可通过安装插件添加额外的功能。例如,延迟队列、优先队列、管理控制台等插件。
  • Kafka
    相比RabbitMQ,Kafka只有单一的Topic通讯方式,消息在消费后依然不支持死信队列、延迟队列等。
  • RocketMQ
    RocketMQ也是基于Topic进行通讯,毕竟架构模型相似,不过RocketMQ本身支持延迟消息、事务消息等,功能比较丰富。

其他对比

RabbitMQKafkaRocketMQ
社区活跃度较高一版
持久化支持支持支持
并发吞吐极高极高
时效性us级ms级ms级
数据可靠极高
应用场景高可靠交易系统日志系统、大数据应用互联网高并发、高可用应用

总结

每个MQ的功能及作用大差不差,都有自己的优势以及不足,选择适合业务的MQ就可以。

参考文档

Kafka、RabbitMQ、RocketMQ详细了解参考消息中间件专栏

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

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

相关文章

【国科大模式识别】第一次作业

【题目一】设 ωmax⁡\omega_{\max }ωmax​ 为类别状态, 此时对所有的 i(i1,…,c)i(i1, \ldots, c)i(i1,…,c), 有 P(ωmax⁡∣x)≥P\left(\omega_{\max } \mid \boldsymbol{x}\right) \geqP(ωmax​∣x)≥ P(ωi∣x)P\left(\omega_i \mid \boldsymbol{x}\right)P(ωi​∣x) …

理解 mysql 之 count(*)的性能问题

一、 count(*) 为什么性能差 在Mysql中,count()的作用是统计表中记录的总行数。而count()的性能跟存储引擎有直接关系,并非所有的存储引擎,count(*)的性能都很差。在Mysql中使用最多的存储引擎是:innodb 和 myisam 。 在 myisam…

手写RPC框架-整合注册中心模块设计与实现

源码地址:https://github.com/lhj502819/IRpc/tree/v2 思考 如果同一个服务有10台不同的机器进行提供,那么客户端该从哪获取这10台目标机器的ip地址信息呢?随着调用方的增加,如何对服务调用者的数据进行监控呢?服务提…

十五、类加载器、反射、xml

类加载器 1类加载器【理解】 作用 负责将.class文件(存储的物理文件)加载在到内存中 2类加载的过程【理解】 类加载时机 创建类的实例(对象)调用类的类方法访问类或者接口的类变量,或者为该类变量赋值使用反射方式来…

【C++编程调试秘籍】| 总结归纳要点

文章目录一、编译器是捕捉缺陷的最好场合1 如何使用编译器捕捉缺陷二、在运行时遇见错误该如何处理1 该输出哪些错误信息2 执行安全检查则会减低程序效率,该如何处理呢3 当运行时遇到错误时,该如何处理四、索引越界1 动态数组2 静态数组3 多维数组5 指针…

uboot驱动和Linux内核驱动有什么区别?

一、前言 uboot启动后,一些外设如DDR、EMMC、网口、串口、音频、显示等等已经被初始化,为什么Linux内核中还需要写Linux驱动呢? 二、uboot驱动和Linux驱动的区别 1、直观理解 驱动,不仅仅是为了初始化,还实现了一组…

《Linux》1.权限

1.用户 首先介绍一下Linux中的用户概念。Linux下有两种用户:超级用户(root),普通用户。 超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情。 超级用户的命令提示…

FTP回复码

FTP回复码由3个数字和对应文本组成 恢复定义为3个数字编码,紧跟一个空格 sp,然后是一行文本,以telnet的换行符表是结束 但是,某些情况下,文本内容太长超过一行,这就需要在第一行和最后一行特殊处理。处理格…

C++模拟实现栈(stack)和队列 (queue)

目录 一、栈(stack) 的介绍 二、队列(queue) 的介绍 三、容器适配器 二、deque的简单介绍 三、模拟实现stack 3.1 stack.h 3.2 test.cpp 四、模拟实现queue 4.1 queue.h 4.2 test.cpp 一、栈(stack) 的介绍 1. stack是一种容器适配…

字符串、内存函数的介绍(13)

目录 1、字符串函数 1、strlen 模拟实现: 2、strcpy 模拟实现: 3、strcat 模拟实现: 4、strcmp 模拟实现: 5、strncpy 6、strncat 7、strncmp 8、strstr 模拟实现: 9、strtok 10、strerror 11、其他字…

回顾2022年5月IB全球统考成绩,这些学校IB成绩非常亮眼

IB大考成绩放榜,全球17,3878名学生在2022年5月的考试中获得文凭课程(DP)和职业课程(CP)的成绩。今年全球640位考生获得满分45分,全球平均分31.98分。以下是部分公布公布成绩的学校: 成都树德中学国际部:在2022年的全球…

电商维权控价方法论

电商经济繁荣发展,品牌销售渠道多样化,带来流量的同时,各种渠道问题也暴露出来,如,低价、侵权……渠道秩序面临着严峻挑战,品牌生命周期也受到了威胁。所以,越来越多的品牌选择维权控价&#xf…

2022年终总结与2023新年展望

前言 时间过得太快了,虽然写博客已经很多年了,但是年终总结一直由于种种原因没有写过,2022年确实是魔幻的一年,不知不觉自己也已经研二了,因为疫情的原因突然放开,提前放假回家,借此机会写一下…

Git(七) - IDEA 集成 GIT

一、配置 Git 忽略文件 (1)问题1:为什么要忽略他们? 答:与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽IDE工具之 间的差异。 (2)问题2:怎么忽略? …

TP可能用到的函数

说明 该文章来源于同事lu2ker转载至此处,更多文章可参考:https://github.com/lu2ker/ 文章目录说明in_array()filter_var()class_exists()strpos()escapeshellarg()escapeshellcmd()preg_replace()parse_str()无字母数字下划线的webshellstr_replace()e…

GNN algorithm(4): HAN, Heterogeneous Graph Attention Network

目录 background (1) heterogeneity of graph (2) semantic-level attention (3) Node-level attention (4) HAN contributions 2. Related Work 2.1 GNN 2.2 Network Embedding 3. Preliminary background 4. Proposed Model 4.1 Node-level attention ideas: …

Unity脚本(四)

视频教程:https://www.bilibili.com/video/BV12s411g7gU?p149 目录 键盘输入 InputManager 键盘输入 当通过名称指定的按键被用户按住时返回true: bool resultInput.GetKey(KeyCode.A); 当用户按下指定名称按键时的那一帧返回true:…

Python学习笔记——变量和简单数据类型

编码默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码。标识符第一个字符必须是字母表中字母或下划线 _ 。标识符的其他的部分由字母、数字和下划线组成。标识符对大小写敏感。在 Pyth…

【深度学习】机器学习\深度学习常见相关公开数据集汇总(图像处理相关数据集、自然语言处理相关数据集、语音处理相关数据集)

一、前言 1. 介绍 常来说,深度学习的关键在于实践。从图像处理到语音识别,每一个细分领域都有着独特的细微差别和解决方法。 然而,你可以从哪里获得这些数据呢?现在大家所看到的大部分研究论文都用的是专有数据集,这…

超声波测距传感器认知

目录 一、超声波测距传感器认知 二、从零编程实现超声波测距 三、项目——感应开关盖垃圾桶 1、开发步骤 2、感应开关盖垃圾桶代码测试 一、超声波测距传感器认知 超声波测距模块是用来测量距离的一种产品,通过发送和接收超声波,利用时间差和声音…