ActiveMQ RabbitMQ Kafka RocketMQ

news2024/11/18 21:40:21

消息中间件的作用

1.正向作用

        应用解耦/事件驱动
        异步通信
        流量削峰

2.反向作用

        系统可用性降低
        系统复杂性提高
        一致性问题

---------------------------------------------------------------------------------------------------------------------------------

ActiveMQ【Java JMS】

java开发

jms协议

Apache ActiveMQ是Apache软体基金会所研发的开放原始码讯息中间件;由于ActiveMQ是一个纯Java程式,因此只需要作业系统支持Java虚拟机,ActiveMQ便可执行。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

作用原理

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

通信方式

publish-subscribe(发布-订阅方式)
point-to-point(点对点)

消息持久化机制【activemq.xml】

JDBC: 持久化到数据库
AMQ :日志文件
KahaDB : AMQ基础上改进【默认】
LevelDB :谷歌K/V数据库

消息确认机制

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

高可用

单节点部署【不支持高可用】
Master-Slave部署方式【主从模式-支持高可用】
Broker-Cluster部署方式【负载均衡-支持高可用】

消息丢失问题

1.生产者丢失消息的问题可以通过消息重投、重试机制来解决
2.ActiveMQ丢失消息的问题需要通过ActiveMQ消息持久化机制+高可用解决。
3.消费者丢失消息通过ack机制来解决,消息者进行业务处理后,再进行ack确认,避免消息丢失。

消息顺序问题

ActiveMQ因为默认是单queue 队列,所以它模式就是保证消息顺序性消费的。

---------------------------------------------------------------------------------------------------------------------------------

RabbitMQ【Erlang AMQP】

erlang开发

AMQP协议

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

作用原理

组件

组件说明
Channel(信道)消息推送使用的通道
Producer(消息生产者)向消息队列发布消息的客户端
Consumer(消息消费者)从消息队列获取消息的客户端
Message(消息)消息队列中存放的内容(消息头+消息体)
Routing Key(路由键)消息头中的属性,标记消息路由规则,决定交换机转发路径
Queue(消息队列)存储生产者发布的消息
Exchange(交换器路由器)提供Producer到Queue的匹配
Binding(绑定)建立Exchange与Queue的关联
Binding Key(绑定健)建立Exchange与Queue的关联(Routing Key)
Broker(服务主体)RabbitMq的服务器实体

通信方式

简单队列(一对一)
一个消息生产者,一个消息消费者,一个队列。

工作队列模式(一对多)
一个消息生产者,一个交换器,一个消息队列,多个消费者。

发布订阅模式(Pulish/Subscribe)
一个消息生产者,一个交换机(交换机类型为fanout),多个消息队列,多个消费者;生产者只需把消息发送到交换机,绑定这个交换机的队列都会获得一份一样的数据。

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

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

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

 

消息持久化机制【activemq.xml】

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

消息确认机制

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

消高可用

单机模式【不支持高可用】
普通集群模式【不支持高可用】
镜像集群模式【支持高可用】

消息丢失问题

1.生产者消息丢失,通过confirm机制来确认消息发送,然后进行相应的消息重投、重试机制。
2.RabbitMQ丢失消息的问题需要通过RabbitMQ消息持久化机制+高可用来解决。
3.消费者丢失消息通过ack机制来解决,消息者进行业务处理后,再进行ack确认,避免消息丢失。

消息顺序问题

将RabbitMQ拆分多个 queue,每个 queue 一个 consumer,保证消息的顺序性。一个 queue 但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。

---------------------------------------------------------------------------------------------------------------------------------

RocketMQ【java NameServer】

java开发

nameServer无状态节点 

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目。作为经历过多次阿里巴巴双十一的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的企业使用。

作用原理

组件

组件说明
Producer消息生产者
Producer Group生产者组
Consumer消息消费者
Consumer Group消费者组
Topic消息主题,生产者将消费发送到Topic,消费者订阅Topic
Message消息
TagTopic的细化,标签
Broker接收消息、存储消息
Queue一个Topic对应多个Queue(负载均衡)
OffsetTopic下Queue的索引,Offset存在当前Queue中
NameServer注册中心

通信方式

集群模式和广播模式
集群模式:消费者组收到消息后,只有其中的一台机器会接收到消息。
广播模式:消费者组内的每台机器都会收到这条消息。

Push模式和 Pull模式
Push(MQPushConsumer)和Pull模式(MQPullConsumer)本质都是采用消费端主动拉取的方式,即consumer轮询从broker拉取消息

消息持久化机制

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

消息确认机制

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

高可用

单节点模式【不支持高可用】
多节点模式【多Master模式【不支持高可用】、多Master多Slave模式【异步复制-支持高可用】、多Master多Slave模式【同步双写-支持高可用】】

消息丢失问题

1.生产者消息丢失,通过confirm机制来确认消息发送,然后进行相应的消息重投、重试机制。
2.RocketMQ丢失消息的问题需要通过RocketMQ消息持久化机制+高可用来解决。
3.消费者丢失消息通过ack机制来解决,消息者进行业务处理后,再进行ack确认,避免消息丢失。

消息顺序问题

RocketMQ保证消息顺序性方法与Kafka大致相同。一个 topic,一个 queue,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。

---------------------------------------------------------------------------------------------------------------------------------

Kafka【Scala ZK注册中心】

Scala(java)开发

ZK注册中心

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

作用原理

组件

组件说明
Producer生产者
Consumer消费者
Consumer Group消费者组
Broker一个kafka服务器就是一个broker,一个集群由多个broker组成,一个broker中包含多个topic
Topic一个消息队列,生产者和消费者都对应一个Topic
Partition一个Partition一个有序队列,Partition是Topic中存储数据和消息所使用队列的容器
Replica副本
Leader主分区,生成者生产数据的对象,消费组消费数据的对象
Follower副分区

通信方式

生产者发送模式
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;消息处理成功之后再提交。

消息持久化机制

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

消息确认机制

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

高可用

单broke节点【不支持高可用】
单机多broker模式【支持高可用】
多机多broker模式【支持高可用】

消息丢失问题

1.生产者消息丢失,通过confirm机制来确认消息发送,然后进行相应的消息重投、重试机制。
2.Kafka直接将数据写入到日志文件中,以追加的形式写入。
3.消费者丢失消息通过ack机制来解决,消息者进行业务处理后,再进行ack确认,避免消息丢失。

消息顺序问题

一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。

---------------------------------------------------------------------------------------------------------------------------------

终极消息丢失问题

在处理生产者消息丢失问题、消息丢失问题、消费者丢失问题后,并不能100%保证消息丢失问题,可以添加数据库辅助记录:生产者发送消息时同步发送一条消息到数据库中,消费者拿到消息并完成业务处理后,从数据库删除对应的记录。

MQ终极问题

原理,高可用,重复消息,顺序读写,数据丢失几个方面开展。

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

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

相关文章

C语言数据结构(3)----无头单向非循环链表

目录 1. 链表的概念及结构 2. 链表的分类 3. 无头单向非循环链表的实现(下面称为单链表) 3.1 SListNode* BuySListNode(SLTDateType x) 的实现 3.2 void SListPrint(SListNode* plist) 的实现 3.3 void SListPushBack(SListNode** pplist, SLTDateType x) 的实现 3.4 voi…

【分布式】分布式场景下的稳定性保障

文章目录1、什么是稳定性保障2、明确稳定性保障目标2.1、明确一级目标2.2、拆解二级目标3、如何进行稳定性保障3.1、全链路梳理3.2、全链路压测3.3、集群扩容3.4、服务限流3.5、提前预案3.6、紧急预案3.7、系统监控4、大促稳定性保障4.1、制定大促计划4.2、大促准备4.3、大促值…

kubeadm方式安装k8s高可用集群(版本1.26x)

K8S官网:https://kubernetes.io/docs/setup/ 高可用Kubernetes集群规划 配置备注系统版本CentOS 7.9Docker版本20.10.xPod网段172.16.0.0/12Service网段10.103.10.0/16 主机IP说明k8s-master01 ~ 03192.168.77.101 ~ 103master节点 * 3k8s-master-lb192.168.77.2…

Tina_Linux配网开发指南

OpenRemoved_Tina_Linux_配网_开发指南 1 概述 1.1 编写目的 介绍Allwinner 平台上基于wifimanager-v2.0 的WiFi 配网方式,包括softap(WiFi ap 模式热点配网),soundwave(声波配网),BLE(蓝牙低功耗配网)。 1.2 适用范围 • allwinner 软件平台tina v5.0 版本及以…

锁相环的组成和原理及应用

一.锁相环的基本组成 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。 锁相环路是一种反馈控制电路,简称锁相环(PLL)。锁相环的特点是:利用外部输入的参考信号控制环路内…

Java查漏补缺(04)IDEA安装设置、JDK相关设置、详细设置、工程与模块管理、代码模板的使用、快捷键的使用、DEBUG断点调试、常用插件

Java查漏补缺(04)IDEA安装设置、JDK相关设置、详细设置、工程与模块管理、代码模板的使用、快捷键的使用、DEBUG断点调试、常用插件本章专题与脉络1. 认识IntelliJ IDEA1.1 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA的主要优势:(vs …

Ubuntu下不能切换中文,qt creator无法输入中文,sogo输入法(详细步骤)

目录:1、解决ubuntu 不支持切换中文,并安装sogo输入法步骤;2、解决Qt Creator不支持中文输入:详细步骤:一、解决ubuntu 不支持切换中文,并安装sogo输入法步骤:1、如果在键盘输入法系统中&#x…

Scala面向对象

与java的区别和联系 类的定义: class Person{ var name "scala" def sayHello(){ println("Hello,"name) } def getName name } 注意:如果在定义方法的时候指定了(),那么在调用的时候()可写可不写,如果在定…

【并发编程学习篇】深入理解CountDownLatch

一、CountDownLatch介绍 CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。CountDownLatch使用给定的计数值(count)初始化。await方法会阻塞直到当前的计数值被coun…

【分布式缓存学习篇】Redis数据结构

一、Redis的数据结构 二、String 数据结构 2.1 字符串常用操作 //存入字符串键值对 SET key value //批量存储字符串键值对 MSET key value [key value ...] //存入一个不存在的字符串键值对 SETNX key value //获取一个字符串键值 GET ke…

[C++]继承

🥁作者: 华丞臧 📕​​​​专栏:【C】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉LeetCode 文章目录一、继承…

C/C++每日一练(20230227)

目录 1. 按要求排序数组 ★ 2. Z 字形变换 ★★ 3. 下一个排列 ★★ 1. 按要求排序数组 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中,数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小…

新型智慧城市顶层规划及智慧应用综合解决方案

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 业务需求分析系统功能需求分析 …

一文了解虚拟人主播

这两年,相信很多人都能在抖音、快手、微视等平台看到虚拟人主播的视频,形象逼真,表情动作自然,语言流畅,乍一看,就是一位真人!那为什么会有这么多人或者企业选择用虚拟人来做主播呢?…

12万字数字政府县级智慧政务云平台建设方案WORD

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 1.1 总体方案设计 云平台是云计…

评论对软件品牌很重要:有效地生成和管理评论

评论已成为几乎所有产品类别购买过程中的重要组成部分。 客户评论数据告诉我们,92% 的消费者使用在线评论来指导他们的大部分普通购买决策,软件也不例外。B2B 买家在做出购买决定之前会进行大量研究。 为什么评论对软件品牌很重要 B2B 买家特别希望听到已…

对IDEA中断点Suspend 属性理解

suspend的类型分为 1、ALL:有线程进入该断点时,暂停所有线程 2、Thread:有线程进入该断点时,只暂停该线程 讨论下不同线程在同一时间段都遇到断点时,idea的处理方法。假如在执行时间上,thread1会先进入断…

Android实现连线题效果

效果图全部正确:有对有错:结果展示,纯黑色:支持图片:实现思路仔细分析可以发现,连线题的布局可以分为两部分,一个是左右两列矩形,另一个是他们之间的连线。每个矩形的宽高都一样&…

并非从0开始的c++ day8

并非从0开始的c day8结构体结构体嵌套二级指针练习结构体偏移量内存对齐内存对齐的原因如何内存对齐文件操作文件的概念流的概念文本流二进制流文件缓冲区文件打开关闭文件关闭fclose文件读写函数回顾按格式化读写文件文件读写注意事项结构体 结构体嵌套二级指针练习 需求&am…

Delphi 中 FireDAC 数据库连接(定义连接)

一、定义连接(FireDAC)概述连接定义是一组参数,它定义了如何使用特定的FireDAC驱动将一个应用程序连接到DBMS。它相当于一个BDE别名、ADO UDL(存储的OLEDB连接字符串)或ODBC数据源名称(DSN)。关…