首页 > 其他分享 >消息队列MQ核心原理全面总结(11大必会原理)

消息队列MQ核心原理全面总结(11大必会原理)

时间:2022-09-22 09:44:49浏览次数:91  
标签:11 订阅 队列 broker 发送 RPC MQ 消息 原理

MQ消息队列的12点核心原理总结-mikechen的互联网架构

消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。

无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等,都有的一些基本原理、术语、机制等,总结分享出来,希望大家在使用消息队列技术的时候能够快速理解。

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

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

2.设计Broker主要考虑

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

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

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

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

3. 点对点消息队列模型

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

MQ消息队列的12点核心原理总结-mikechen的互联网架构

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

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

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

特点

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

4. 发布订阅消息模型Topic

MQ消息队列的12点核心原理总结-mikechen的互联网架构

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

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

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

特点

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

5.点对点和发布订阅的区别

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

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

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.消息队列的选型和应用场景

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

以上

作者简介

陈睿|mikechen,10年+大厂架构经验,《BAT架构技术500期》系列文章作者,分享十余年架构经验以及面试心得!

阅读mikechen的互联网架构更多技术文章合集

Java并发|JVM|MySQL|Spring|Redis|分布式|高并发|架构师

标签:11,订阅,队列,broker,发送,RPC,MQ,消息,原理
From: https://www.cnblogs.com/mikechenshare/p/16718088.html

相关文章

  • 类欧几里得,以及ARC111E和ARC123E
    例题https://atcoder.jp/contests/practice2/tasks/practice2_c在\(O(\log(n+m+k+b))\)的时间复杂度求:\[\sum_{i=0}^{n-1}\lfloor{\frac{ki+b}{m}}\rfloor\]其中\(n,......
  • 服务异步通信-(rabbitmq)高级篇
    服务异步通信-高级篇 0.RabbitMQ的基础知识回顾 消息队列在使用过程中,面临着很多实际问题需要思考:  1.消息可靠性消息从发送,到消费者接收,会经理多个过程:其......
  • Java并发编程解析 | 基于JDK源码解析Java领域中并发锁之同步器Semaphore,CyclicBarrier
    苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享......
  • Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理
    苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享......
  • 1102_REDIS中使用LUA
    定时删除公司费用查询费用并删除数据,保持原子操作准备数据saddsms:send:batchDeduct:company000002sismembersms:send:batchDeduct:company000002hgetallsm......
  • 编译原理:运行时机制
    在语义分析之后,编译过程就开始进入了中后端。经过前端阶段的处理分析,编译器已经充分理解了源代码的含义,准备好把前端处理的结果(带有标注信息的AST、符号表)翻译成目标代码......
  • 绕过TMP限制安装Win11的方法
    首先下载一个Windows11安装免TPM2.0补丁,按照文中所示的方法替换镜像中的文件。如果还有错误提示的话,再加一个注册表设置:WindowsRegistryEditorVersion5.00[HKEY_LOCA......
  • Panama-FFI实现原理与移植
    移植FFI在说明如何对FFI进行移植之前需要先说明FFI的实现原理。JEP424是外部函数访问+本地内存,但是实际上需要移植的内容只有外部函数访问,对于本地内存的操作并不需要修改......
  • openstack-rabbitmq
    消息队列:是一种应用程序对应用程序的通信方法,应用程序通过读取和写入队列的消息来通信。消息传递指的是程序之间通过消息中发送的数据进行通信,而不是通过直接的调用彼此来......
  • 1211. 蚂蚁感冒
    https://www.acwing.com/problem/content/description/1213/脑经急转弯类型,主要要想出来的是两两相遇可以看成是小球无损碰撞,即[穿过],因为前后两者之间的状态一致分......