消息中间件:简述消息队列(MessageQueue)
消息中间件:简述消息队列(MessageQueue)
消息队列(MessageQueue)是服务架构中常见的组件,可用于服务间解耦、事件广播、任务异步/延迟处理等,常用于分布式系统之间互相信息的传递。接下来对消息队列的实现如何满足几种消费场景进行简单阐述。
一 . 消息队列相关概念
1、生产者(Producer):负责产生消息;
2、消费者(Consumer):负责消费消息;
3、消息(Message):在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象;
4、消息队列(Message Queue):一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
5、消息代理(Message Broker):负责存储/转发消息,转发分为推和拉两种。
拉是指Consumer主动从Message Broker获取消息;
推是指Message Broker主动将Consumer感兴趣的消息推送给Consumer。
二 . 消息队列的消费场景
1、消息至多被消费一次
该场景是最容易满足的,特点是整个消息队列吞吐量大,实现简单。适合能容忍丢消息,消息重复消费的任务。
a)Producer发送消息到Message Broker阶段:
Producer发消息给Message Broker,不要求Message Broker对接收到的消息响应确认,Producer也不用关心Message Broker是否收到消息了。
b)Message Broker存储/转发阶段:
对Message Broker的存储不要求持久性,转发消息时也不用关心Consumer是否真的收到了。
c)Consumer消费阶段:
Consumer从Message Broker中获取到消息后,可以从Message Broker删除消息,或Message Broker在消息被Consumer拿去消费时删除消息,不用关心Consumer最后对消息的处理结果。
2、消息至少被消费一次
适合不能容忍丢消息,但允许重复消费的任务。
a)Producer发送消息到Message Broker阶段:
Producer发消息给Message Broker,Message Broker必须响应对消息的确认。
b)Message Broker存储/转发阶段:
Message Broker必须提供持久性保障,转发消息时,Message Broker需要Consumer通知删除消息,才能将消息删除。
c)Consumer消费阶段:
Consumer从Message Broker中获取到消息,必须在消费完成后,Message Broker上的消息才能被删除。
3、消息仅被消费一次
适合对消息消费情况要求非常高的任务,实现较为复杂,这里的“仅被消费一次”包含如下两种场景:
1)Message Broker上存储的消息被Consumer仅消费一次,场景要求:
a)Producer发送消息到Message Broker阶段:
Producer发消息给Message Broker,不要求Message Broker对接收到的消息响应确认,Producer也不用关心Message Broker是否收到消息了。
a)Message Broker存储/转发阶段:
Message Broker必须提供持久性保障,并且每条消息在其消费队列里有唯一标识(这个唯一标识可以由Producer产生,也可以由Message Broker产生)。
a)Consumer消费阶段:
Consumer从Message Broker中获取到消息后,需要记录下消费的消息标识,以便在后续消费中防止对某个消息重复消费。比如Consumer获取到消息,消费完后,还没来得及从Message Broker删除消息,就挂了,这样Message Broker如果把消息重新加入待消费队列的话,那么这条消息就会被重复消费了。
2)Producer上产生的消息被Consumer仅消费一次,场景要求:
a)Producer发送消息到Message Broker阶段:
Producer发消息给Message Broker,Message Broker必须响应对消息的确认,并且Producer负责为该消息产生唯一标识,以防止Consumer重复消费(因为Producer发消息给Message Broker后,由于网络问题没收到Message Broker的响应,可能会重发消息给到Message Broker)。
b)Message Broker存储/转发阶段:
Message Broker必须提供持久性保障,并且每条消息在其消费队列里有唯一标识(这个唯一标识需要由Producer产生)。
c)Consumer消费阶段:
Consumer从Message Broker中获取到消息后,需要记录下消费的消息标识,以便在后续消费中防止对某个消息重复消费。比如Consumer获取到消息,消费完后,还没来得及从Message Broker删除消息,就挂了,这样Message Broker如果把消息重新加入待消费队列的话,那么这条消息就会被重复消费了。
参考:https://mp.weixin.qq.com/s/g5Qq_gasJbDFVfOYkZaPcg
消息中间件:简述消息队列(MessageQueue)相关推荐
- 【Android 异步操作】手写 Handler ( 循环者 Looper | Looper 初始化 | Looper 遍历消息队列 MessageQueue )
文章目录 一.Looper 初始化 二.Looper 遍历消息队列 MessageQueue 三.完整 Looper 代码 一.Looper 初始化 Looper 是 线程本地变量 , 在每个线程中 ...
- 【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )
文章目录 一.MessageQueue 消息队列存储消息 二.MessageQueue 消息队列取出消息 三.消息队列完整代码 一.MessageQueue 消息队列存储消息 Message 链表 : ...
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...
- python 消息中间件_消息队列中间件 RabbitMQ 详细介绍——安装与基本应用(Python)...
RabbitMQ 是当前最流行的消息中间件(Message Broker)之一,支持多种消息协议(如 AMQP.MQTT). 同时它也是一个轻量级的非常易于部署的开源软件,可以运行在当前大多数操作系统 ...
- 从没有人能把MOM异步通信,消息中间件,消息队列?给一次性讲清
MOM异步通信 在微服务架构中,使用REST和RPC的方式最大的问题就是请求/响应模式的通信模式可能导致服务之间调用的可用性降低,客户端与服务端需要同时在线,双方都需要知道对方的URL地址,或者服务消 ...
- 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )
文章目录 一.MessageQueue 的 Java 层机制 二.MessageQueue 的 native 层阻塞机制 三.MessageQueue 的 native 层解除阻塞机制 三.Messa ...
- 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )
文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...
- weblogic jms消息 删除_消息队列与消息中间件概述:消息中间件核心概念与技术选型...
什么是消息? "消息"是在两台计算机间传送的数据单位. 消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象. 什么是队列? 队列(Queue)队列是一种先进先出 ...
- android自定义队列,Android 消息机制(一)消息队列的创建与循环的开始 Looper与MessageQueue...
写在前面 本文基于Android 7.1.1 (API 25)的源码分析编写 与之前的触摸事件分发机制分析的文章一样,Android系统机制的分析中关键的一环就是事件消息的处理.之前也说过,Andro ...
- 消息队列及常见消息中间件
可以直接去看原文:浅谈消息队列及常见的消息中间件 简介 消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段.它具有 低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 当前使用较多的 ...
最新文章
- ASP.NET-Cookies的用法
- verilog 浮点转定点_浮点数0.1+0.2为何不等于0.3
- 使用Java将数据流式传输到HPCC
- 进程之间的通信方式-共享内存
- php下拉列表 二级 联动,PHP+Ajax实现二级联动下拉菜单!
- Educational Codeforces Round 30 A[水题/数组排序]
- php warning: array_merge(),php数组合并array_merge()函数使用注意事项_php技巧
- 强悍的 Linux —— 文件解压与解压
- Harmony OS — Checkbox多选框
- 应用系统适配迁移方案
- office 2010 系列问题
- C语言从入门到不放弃---编程环境的搭建到上手写代码
- 计算机程序班搞笑口号,集搞笑自创的运动会口号?
- 1.42 财务测量指标——静态评价法(投资回报率+投资回收期)
- 【电脑使用】桌面图标有蓝底怎么去掉
- 智能卡 PSAM 卡片文件结构
- 如何保养笔记本的电池
- win10系统无法访问指定设备或路径怎么解决?
- 有关颜色敏感度测试的软件是啥,测试你对颜色的敏感度,最后一题能答对算你厉害!...
- 信息安全-网络安全的三大支柱和攻击向量