MQ消息队列的12点核心原理总结

MQ消息队列的12点核心原理总结1 消息生产者 消息者 队列消息生产者 Producer 发送消息到消息队列 消息消费者 Consumer 从消息队列接收消息 Broker 概念来自与 ApacheActive 指 MQ 的服务端 帮你把消息从发送端传送到接收端 消息队列 Queue 一个先进先出的消息存储区域 消息按照顺序发送接收 一旦消息被消费处理 该消息将从队列中删除 2 设计 Broker 主要考虑 1 消息

1. 消息生产者、消息者、队列

  • 消息生产者Producer:发送消息到消息队列。
  • 消息消费者Consumer:从消息队列接收消息。
  • Broker:概念来自与Apache ActiveMQ,指MQ的服务端,帮你把消息从发送端传送到接收端。
  • 消息队列Queue:一个先进先出的消息存储区域。消息按照顺序发送接收,一旦消息被消费处理,该消息将从队列中删除。
2.设计Broker主要考虑

1)消息的转储:在更合适的时间点投递,或者通过一系列手段辅助消息最终能送达消费机。

2)规范一种范式和通用的模式,以满足解耦、最终一致性、错峰等需求。

3)其实简单理解就是一个消息转发器,把一次RPC做成两次RPC。发送者把消息投递到broker,broker再将消息转发一手到接收端。

总结起来就是两次RPC加一次转储,如果要做消费确认,则是三次RPC。

3. 点对点消息队列模型

点对点模型 用于 消息生产者 和 消息消费者 之间 点到点 的通信。

file

点对点模式包含三个角色:

  • 消息队列(Queue)
  • 发送者(Sender)
  • 接收者(Receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,可以放在 内存 中也可以 持久化,直到他们被消费或超时。

特点

每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)发送者和接收者之间在时间上没有依赖性接收者在成功接收消息之后需向队列应答成功

4. 发布订阅消息模型Topic

file

发布订阅模型包含三个角色:

  • 主题(Topic)
  • 发布者(Publisher)
  • 订阅者(Subscriber)

多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

特点

  • 每个消息可以有多个消费者:和点对点方式不同,发布消息可以被所有订阅者消费
  • 发布者和订阅者之间有时间上的依赖性。
  • 针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
  • 为了消费消息,订阅者必须保持运行的状态。
5.点对点和发布订阅的区别

生产者发送一条消息到队列queue,只有一个消费者能收到。

发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。

file

6. 消息的顺序性保证

基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。

7. 消息的ACK机制

即消息的Ackownledge确认机制,

为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消

息了。如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。

8.最终一致性的设计思路

主要是用“记录”和“补偿”的方式。

本地事务维护业务变化和通知消息,一起落地,然后RPC到达broker,在broker成功落地后,RPC返回成功,本地消息可以删除。否则本地消息一直靠定时任务轮询不断重发,这样就保证了消息可靠落地broker。

broker往consumer发送消息的过程类似,一直发送消息,直到consumer发送消费成功确认。

我们先不理会重复消息的问题,通过两次消息落地加补偿,下游是一定可以收到消息的。然后依赖状态机版本号等方式做判重,更新自己的业务,就实现了最终一致性。

如果出现消费方处理过慢消费不过来,要允许消费方主动ack error,并可以与broker约定下次投递的时间。

对于broker投递到consumer的消息,由于不确定丢失是在业务处理过程中还是消息发送丢失的情况下,有必要记录下投递的IP地址。决定重发之前询问这个IP,消息处理成功了吗?如果询问无果,再重发。

事务:本地事务,本地落地,补偿发送。本地事务做的,是业务落地和消息落地的事务,而不是业务落地和RPC成功的事务。消息只要成功落地,很大程度上就没有丢失的风险。

9. 消息的事务支持

消息的收发处理支持事务,例如:在任务中心场景中,一次处理可能涉及多个消息的接收、处理,这应该处于同一个事务范围内,如果一个消息处理失败,事务回滚,消息重新回到队列中。

10. 消息的持久化

消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。

11. 消息队列的高可用性

在实际生产环境中,使用单个实例的消息队列服务,如果遇到宕机、重启等系统问题,消息队列就无法提供服务了,因此很多场景下,我们希望消息队列有高可用性支持,例如

RabbitMQ的镜像集群模式的高可用性方案,ActiveMQ也有基于LevelDB ZooKeeper的高可用性方案,以及Kafka的Replication机制等。

12.消息队列的选型和应用场景

具体请参考:高并发架构系列:分布式之消息队列的特点、选型、及应用场景详解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227483.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:12
下一篇 2026年3月16日 下午9:13


相关推荐

  • 千兆以太网在国产FPGA(智多晶)上的实现[通俗易懂]

    千兆以太网在国产FPGA(智多晶)上的实现[通俗易懂]**千兆以太网在国产FPGA(智多晶)上的实现闲来无事,想了想写点东西,顺带着记录一下自己学习的过程,其中千兆以太网这个模块是之前的一个项目任务,已经实现,但是想着自己在这里面也遇到过许多坑,所以写点东西,避免后来者遇到相同的问题,以后尽量避免事后总结,要做到边做边总结;在2020年国产化的大趋势下,国产芯片开始发展,在这样的时代背景下,我开始了千兆以太网的学习;实现的是简单千兆以太网的实现,利用udp协议、arp协议等千兆以太网的通信,在介绍具体操作流程的过程前,我先介绍一下千兆以太网的设计框架,

    2022年8月30日
    6
  • python随机产生数字_随机数生成excel

    python随机产生数字_随机数生成excel使用场景:随机短信验证码importrandomimportstring#指定随机数长度r_num=4#生成数字+字母(字符串序列)token=string.ascii_letters+string.digits”’string.ascii_letters:生成大小写字母(type:字符串)string.digits:生成数字…

    2026年4月16日
    6
  • Deep Reinforcement Learning – 1. DDPG原理和算法

    Deep Reinforcement Learning – 1. DDPG原理和算法DeepReinforc 1 DDPG 原理和算法背景描述 DDPG 的定义和应用场景 DDPG 算法相关基本概念定义 DDPG 实现框架和算法 DDPG 对于 DPG 的关键改进下一篇以下用 RL 作为 Reinforcemen 的简称 背景描述概括来说 RL 要解决的问

    2026年3月20日
    2
  • 谷歌搜索语法大全_Google语法

    谷歌搜索语法大全_Google语法Google是一款十分强大的搜索引擎,黑客们常常借助它搜索网站的一些敏感目录和文件,甚至可以利用它的搜索功能来自动攻击那些有漏洞的网站;而有些人可以通过搜索把某个个人的信息,包括住址、电话号码、出生年月等都可以搜索出来;当然我们在日常的生活中正确的借助Google搜索也可以更加高效的找到我们需要的东西。

    2025年10月25日
    5
  • 什么是json?_string转json

    什么是json?_string转json1.什么是JSONJSON概念很简单,JSON是一种轻量级的数据格式,他基于javascript语法的子集,即数组和对象表示。由于使用的是javascript语法,因此JSON定义可

    2022年8月3日
    8
  • android菜鸟教程_菜鸟软件下载app

    android菜鸟教程_菜鸟软件下载app相对布局是通过相对定位的方式让控件出现在布局任意位置; 在相对布局中如果不指定控件摆放的位置,那么控件都会被默认放在RelativeLayout的左上角。因此要先指定第一个控件的位置,其他控件为该位置的相对位置;RelativeLayout属性:(使用相对布局属性需要先指定控件的id,其他控件根据该控件的id,来确定相对于该控件的相对位置)示例:xmlversion=”1

    2025年6月22日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号