ActiveMQ、RabbitMQ、RocketMQ、Kafka区别

news2024/11/28 4:51:13

1、4种消息中间件比较

特性ActiveMQRabbitMQRocketMQKafka
开发语⾔javaerlangjavascala
单机吞吐量万级万级10万级10万级
时效性ms级us级ms级ms级以内
可⽤性⾼(主从架构)⾼(主从架构)⾮常⾼(分布式架构)⾮常⾼(分布式架构)
功能特性

成熟的产品,

在很多公司得到应⽤;

有较多的⽂档;

各种协议⽀持较好

基于erlang开发,

所以并发能⼒很强,

性能极其好,

延时很低;

管理界⾯较丰富

MQ功能⽐较完备,

扩展性佳

只⽀持主要的MQ功能,
像⼀些消息查询,消息回
溯等功能没有提供,毕竟
是为⼤数据准备的,在⼤
数据领域应⽤⼴。

1.1、消息中间件的使用场景

解耦、异步、削峰

  • 解耦

如果我方系统A要与三方B系统进行数据对接,推送系统人员信息,通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整,或者推送过程中B系统网络进行了调整,又或者后续过程中我们需要推送信息到三方C系统中,这样的话就需要我们进行频繁的接口开发调整,还需要考虑接口推送消息失败的场景。如果我们使用消息中间件进行消息推送,我们只需要按照一种约定的数据结构进行数据推送,其他三方系统从消息中间件取值消费就可以,即便是三方系统出现宕机或者其他调整,我们都可以正常进行数据推送。

  • 异步

如果我们现在需要同时推送消息到BCD三个系统中,而BCD系统接收到消息后需要进行复杂的逻辑处理,以及读库写库处理。如果一个三方系统进行消息处理需要1s,那我们遍历推送完一次消息,就需要三秒。而如果我们使用消息中间件,我们只需要推送到消息中间件,然后进行接口返回,可能只需要20ms,大大提升了用户体验。消息推送后BCD系统各自进行消息消费即可,不需要我们等待。

  • 削峰

如果某一时间段内,每秒都有一条消息推送,如果我们使用接口进行推送,BCD三个系统处理完就需要三秒。这样会导致用户前端体验较差,而且系统后台一直处于阻塞状态,后续的消息推送接口一直在等待。如果我们使用消息中间件,我们只需要将消息推送至消息中间件中,BCD系统对积压的消息进行相应的处理。

1.2、消息中间件的缺点

  • 系统可用性降低

系统关联的中间件越多,越容易引发宕机问题。原本进行消息推送我们只需要开发接口进行推送即可,引入消息中间件后就需要考虑消息中间件的高可用问题,如果消息中间件出现宕机问题,我们所有的消息推送都会失败。

  • 系统复杂度提高

如果我们使用接口进行消息推送,我们只需要考虑接口超时以及接口推送消息失败的问题。但我们引入消息中间件后,就需要考虑消息中间件的维护,以及消息重复消费,消息丢失的问题。

  • 一致性问题

如果我们使用接口进行消息推送,推送消息我们可以放在事务中处理,如果推送过程中出现异常,我们可以进行数据回滚,但我们引入消息中间件后,就需要考虑消息推送后,消费失败的问题,以及如果我们同时推送消息到BCD系统中,如何保证他们的事务一致性。

2、ActiveMQ

2.1、Activemq 是什么

Activemq 是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。

2.2、Activemq 的作用及原理

Activemq 的作用就是系统之间进行通信,原理就是生产者生产消息, 把消息发送给activemq, Activemq 接收到消息, 然后查看有多少个消费者,然后把消息转发给消费者, 此过程中生产者无需参与。 消费者接收到消息后做相应的处理和生产者没有任何关系。

2.3、Activemq 的通信方式

  • publish(发布)-subscribe(订阅)(发布-订阅方式)

发布/订阅方式用于多接收客户端的方式,作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。一个接收端只能接收他创建以后发送客户端发送的信息。

  • p2p(point-to-point)(点对点)

2p的过程则理解起来比较简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中因为有多个用户对使用p2p的链路,相互通信的双方是通过一个类似于队列的方式来进行交流。和前面pub-sub的区别在于一个topic有一个发送者和多个接收者,而在p2p里一个queue只有一个发送者和一个接收者。

2.4、Activemq 的消息持久化机制

JDBC: 持久化到数据库
AMQ :日志文件(已基本不用)
KahaDB : AMQ基础上改进,默认选择
LevelDB :谷歌K/V数据库
在activemq.xml中查看默认的broker持久化机制。

2.5、Activemq 的消息确认机制

  1. AUTO_ACKNOWLEDGE = 1 自动确认
  2. CLIENT_ACKNOWLEDGE = 2 客户端手动确认
  3. DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
  4. SESSION_TRANSACTED = 0 事务提交并确认
  5. INDIVIDUAL_ACKNOWLEDGE = 4 单条消息确认

3、RabbitMQ

3.1、RabbitMQ是什么

RabbitMQ是一个由erlang语言编写的、开源的、在AMQP基础上完整的、可复用的企业消息系统。

3.2、RabbitMQ的作用及原理

3.3、RabbitMQ的通信方式

  • 简单队列

最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列。也称为点对点模式

  • 工作队列模式

一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式

  • 发布订阅模式

Pulish/Subscribe,无选择接收消息,一个消息生产者,一个交换机(交换机类型为fanout),多个消息队列,多个消费者,生产者只需把消息发送到交换机,绑定这个交换机的队列都会获得一份一样的数据。

  • 路由模式

在发布/订阅模式的基础上,有选择的接收消息,也就是通过 routing 路由进行匹配条件是否满足接收消息。

  • 主体模式

topics(主题)模式跟routing路由模式类似,只不过路由模式是指定固定的路由键 routingKey,而主题模式是可以模糊匹配路由键 routingKey,类似于SQL中 = 和 like 的关系。

  • RPC模式

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的处理业务,处理完后然后在A服务器继续执行下去,把异步的消息以同步的方式执行。

3.4、RabbitMQ的消息持久化机制

  • Queue(消息队列)的持久化是通过durable=true来实现的。
  • Message(消息)的持久化 ,通过设置消息是持久化的标识。
  • Exchange(交换机)的持久化 。

3.5、RabbitMQ的消息确认机制

  • confirm机制:确认消息是否成功发送到Exchange
  • ack机制:确认消息是否被消费者成功消费
  • AcknowledgeMode.NONE:自动确认
  • AcknowledgeMode.AUTO:根据情况确认
  • AcknowledgeMode.MANUAL:手动确认

4、RocketMQ

4.1、RocketMQ是什么

RocketMQ是阿里开发的一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。

4.2、RocketMQ的作用及原理

 4.3、RocketMQ的通信方式

RocketMQ消息订阅有两种模式

一种是Push模式(MQPushConsumer),即MQServer主动向消费端推送

另外一种是Pull模式(MQPullConsumer),即消费端在需要时,主动到MQ Server拉取

但在具体实现时,Push和Pull模式本质都是采用消费端主动拉取的方式,即consumer轮询从broker拉取消息

集群模式和广播模式

集群模式:默认情况下我们都是使用的集群模式,也就是说消费者组收到消息后,只有其中的一台机器会接收到消息。

广播模式:消费者组内的每台机器都会收到这条消息。

4.4、RocketMQ的消息持久化机制

exchange持久化、queue持久化、message持久化

CommitLog:日志数据文件,存储消息内容,所有 queue 共享,不区分 topic ,顺序读写 ,1G 一个文件

ConsumeQueue:逻辑 Queue,基于 topic 的 CommitLog 的索引文件,消息先到达 commitLog,然后异步转发到 consumeQueue,包含 queue 在 commitLog 中的物理偏移量 offset,消息实体内容大小和 Message Tag 的 hash 值,大于 600W 个字节,写满之后重新生成,顺序写

IndexFile:基于 Key 或 时间区间的 CommitLog 的索引文件,文件名以创建的时间戳命名,固定的单个 indexFile 大小为 400M,可以保存 2000W 个索引

4.5、RocketMQ的消息确认机制

  • confirm机制:确认消息是否成功发送到Exchange
  • ack机制:确认消息是否被消费者成功消费

5、Kafka

5.1、Kafka是什么

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统,可作为消息中间件

5.2、Kafka的作用及原理

 5.3、Kafka的通信方式

  • 生产者发送模式
  1. 发后即忘(fire-and-forget):只管往Kafka中发送消息而并不关心消息是否正确到达
  2. 同步(sync):一般是在send()方法里指定一个Callback的回调函数,Kafka在返回响应时调用该函数来实现异步的发送确认。
  3. 异步(async):send()方法会返回Futrue对象,通过调用Futrue对象的get()方法,等待直到结果返回
  • 消费者消费模式
  1. At-most-once(最多一次):在每一条消息commit成功之后,再进行消费处理;设置自动提交为false,接收到消息之后,首先commit,然后再进行消费。
  2. At-least-once(最少一次):在每一条消息处理成功之后,再进行commit;设置自动提交为false;消息处理成功之后,手动进行commit。
  3. Exactly-once(正好一次):将offset作为唯一id与消息同时处理,并且保证处理的原子性;设置自动提交为false;消息处理成功之后再提交。

5.4、Kafka的消息持久化机制

Kafka直接将数据写入到日志文件中,以追加的形式写入

5.5、Kafka的消息确认机制

  • confirm机制:确认消息是否成功发送
  • ack机制:确认消息是否被消费者成功消费

6、消息重复消费问题

重复消费问题引发后,我们就需要考虑怎么保证幂等性

如果是数据插入操作,插入前我们根据唯一键先进行查询,如果已有数据那我们只进行更新就行。

如果是基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据插入只会报错,不会导致数据库中出现脏数据。

7、消息丢失问题

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

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

相关文章

FFmpeg - Windows下使用ShiftMediaProject方法编译FFmpeg

文章目录一、创建一个ShiftMediaProject文件夹二、下载ShiftMediaProject源码 (以下操作最好都要翻墙)三、下载其他头文件四、编译五、参考资料一、创建一个ShiftMediaProject文件夹 我创建在: C:\ShiftMediaProject 二、下载ShiftMediaPro…

【LeetCode题目详解】(一)27.原地移除元素、88.合并两个有序数组

目录 一、力扣第27题:原地移除元素 1.思路一: 2.思路二 3.思路三 二、力扣第88题:合并两个有序数组 1.思路一: 2.思路二: 3.思路三: 总结 一、力扣第27题:原地移除元素 题目链接&#xf…

基于YOLOv3的车辆号牌定位

01 OCR原理分析 本文中采用的车辆号牌识别部分的是采用CNNLSTMCTC组合而成,整个网络部分可以分为三个部分,首先是主干网络CNN用于提取字符的特征信息,其次采用深层双向LSTM网络在卷积特征的基础上提取文字或字符的序列特征,最终引…

基于java+springboot+mybatis+vue+mysql的校园台球厅人员与设备管理系统

项目介绍 校园台球厅人员与设备管理系统采用java技术,基于springboot框架,前端使用vue技术,mysql数据库进行开发,实现了以下功能: 本系统主要包括管理员和用户两个角色组成,主要包括以下功能:…

m基于LMMSE+turbo算法的信道估计均衡器误码率仿真,对比LS,DEF以及LMMSE三种均衡算法误码率

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 本文推导了符号间干扰(ISI)信道的矢量形状因子图表示。结果图具有树形结构,避免了现有图方法中的短周期问题。基于联合高斯近似,我们在LLR&#xf…

CUDA入门和网络加速学习(二)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识,正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享,方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. 基础矩阵乘法 下图是矩阵乘法的示意图&#xff0…

MySQL表的增删查改(上)

作者:~小明学编程 文章专栏:MySQL 格言:目之所及皆为回忆,心之所想皆为过往 前面给大家分享了关于数据库的一些基本的操作,今天分享的是数据库的核心内容,那就是我们常说的增删查改,也是我们数…

达梦数据库,备份目录冲突

问题描述 达梦数据库执行全库备份,BACKUP DATABASE FULL BACKUPSET ‘/data_share/data_back’; 提示备份目录冲突 解决办法 指定的目录必须为一个空目录。 下图,我指定的目录下有一个test文件夹,所以导致失败,把test文件删除m

[附源码]Python计算机毕业设计SSM基于WEB的网上零食销售系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Python OpenCV中的图像阈值处理

1 前言 上一篇介绍了用C如何对一幅图像进行阈值处理,本篇接着用python来做同样的事情。 图像阈值处理是很多高级算法的底层逻辑之一,比如在做图形检测,轮廓识别时,常常会先对图像进行阈值处理,然后再进行具体的检测或…

FreeRTOS使用 — 合理使用内存 “ 任务中创建任务 ”

前言 在我们学习 RTOS 的过程中,很多朋友都不会遇到内存不够的问题,因为大部分的开发板使用的芯片对学习来说,内存 “足够大” 。所以基本上很多人学会了基本功能,到了实际工作中使用,往往会遇到内存不够的问题&#…

pikachu靶场-10 XXE漏洞

XXE漏洞 概述 XXE -“xml external entity injection” 既"xml外部实体注入漏洞"。 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题" 也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严…

shell语法总结一(持续补充)

文章目录一、变量1、变量的命名规则2、查看变量3、删除命令4、变量的作用域4.1、局部变量4.2、全局变量4.3、环境变量5、自定义变量6、只读变量二、字符串1、单引号2、双引号(用的多)3、拼接字符串4、获取字符串的长度5、提取子字符串三、shell数组1、定…

必须掌握的数据库面试问题

一、为什么用自增列作为主键 1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。 如果也没有这样的唯一索引,则InnoDB会选择内置…

1990-2021年全国各省产业高级化 数据

1990-2021年全国各省产业高级化数据 1、来源为:统计NJ、各省NJ 2、包括:全国31个省份 3、时间:1990-2021年 4、指标包括: 各地区经纬度、第三产业增加值、第二产业增加值、高级化水平 高级化水平第三产业增加值(亿元) / 第二…

HTTP协议【报文格式】

文章目录HTTP协议什么是HTTP协议HTTP协议格式抓包工具的使用HTTP请求URLURL的组成URL encodeHTTP请求的报文格式HTTP响应的报文格式HTTP方法GET方法POST方法POST方法与GET方法的区别请求报头HTTP响应状态码状态码的组成状态码的类别HTTP协议 什么是HTTP协议 HTTP协议即Hyper T…

m基于GA遗传优化的多因素加权竞价博弈频谱分配算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 假设有M个用户均为MIMO Full Duplex&#xff0c;N个频率&#xff0c;1<N<M&#xff0c;设计算法实现M个用户与N个频率的匹配。 由于在一个MIMO系统中&#xff0c;用户数量M大于可用的频谱个…

web自动化测试入门篇04——selenium+python基础方法封装

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

记录一次解决centos不定时触发oom的经历

前言 前一段时间&#xff0c;业务部门的系统不定时的反馈&#xff0c;系统打开不了&#xff0c;提示&#xff1a; 等技术开发同学反应过来去查看业务状态时&#xff0c;服务又恢复了&#xff0c;由于不是核心的业务&#xff0c;并且出问题差不多1分钟左右&#xff0c;没太在意…

【Vue 快速入门系列】todoList案例小总结

文章目录一、案例效果二、项目介绍三、版本更新迭代末、项目素材1.css样式2.html一、案例效果 如下图所示&#xff0c;制作一个这样的记事本&#xff0c;可以使用这个记事本进行数据的存储以及管理&#xff0c;样式是天禹老师写好的我们直接使用就好了&#xff0c;主要在这个小…