Linux编程:--消息队列(MessageQueue)相关概念和原理

 

一、消息队列概述

消息队列(MessageQueue,简称为MQ)
其本质是就是个队列,FIFO先进先出,只不过是队列中储放的主要内容是message,因而叫消息队列
主要用于:不同的服务server、进程process、线程thread相互间通信
二、选用消息队列的场景
①异步处理
②流量控制
③服务解耦
④发布订阅
⑤高并发缓冲

①异步处理
选用场景有短信提醒、终端状态推送、App推送、用户注册等
以秒杀系统为例:
如果不选用消息队列(同步处理):假如选用同步处理,那 当客户成功消费之后,会先写进订单(例如在淘宝中生成一条订单信息),随后再通过短信提醒客户下单成功,最后再在系统中统计这条订单信息
假如选用消息队列(异步处理):当客户成功消费之后,将信息写进消息队列,随后选用1种发布订阅模型,消息队列属于发布者,“订单、短信、统计”三者属于订阅者,这样,“订单、短信、统计”三者可以同时从消息队列中获取信息,就是1种异步处理的操作了.

技术图片

优点: 更快速返回结果
减少等待,实现并发处理,提升系统总体性能

 

②流量控制(削峰)

使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的
例如下图所示,在秒杀场景下:当多个用户通过APP抢购物品,那么就会同时向消息队列中写入数据,当消息队列中数据存满时,那么数据就不能再写入了,此时服务器就会给客户端APP回送一条类似于“淘宝双11时显示的系统繁忙,请稍后再试”的信息,从而达到流量控制


扩容的概念:通过上面我们知道,当消息队列写满之后,说明你的后端服务处理达到了极限,此时可以通过增加后端服务器的数量等来进行扩容,从而可以接收更多的服务器请求。如下图所示:


③服务解耦

使用消息队列实现系统的解耦
传统的发布订阅模式中:A系统负责数据分发,D系统、B系统、D系统分别来接收数据,因为不同系统的类型不同,因此A系统需要分别针对不同的系统调用其相关接口来对其进行服务。当有新系统加入时(例如下图的E系统),那么A系统就要修改源代码,来新增对E系统的接口实现服务。这样看来系统的耦合度太高


当使用消息队列的发布订阅模式之后:A系统直接将内容写入MQ中,然后其他系统也直接从MQ中读取数据,因为MQ的接口是统一的,因此大家使用一套就可以了。这样就使得系统的耦合性降低

 

④发布订阅
比如游戏里面跨服: 广播今天整体还剩多少把屠龙刀可以暴
广播用户暴的屠龙刀的消息

 

⑤高并发缓冲
日志服务(kafka在日志服务用的比较多)、监控上报


三、消息队列的相关概念和原理


Broker

Broker的概念来自与Apache ActiveMQ,通俗的讲就是MQ的服务器

 

消息的生产者、消费者

消息生产者(Producer):发送消息到消息队列
消息消费者(Consumer):从消息队列接收消息

 


点对点消息队列模型

消息生产者向一个特定的队列发送消息,消息消费者从该队列中接收消息
消息的生产者和消费者可以不同时处于运行状态。 每一个成功处理的消息都由消息消费者签收确认 (Acknowledge)

 


发布订阅消息模型-Topic

发布订阅消息模型中,支持向一个特定的主题Topic发布消息,0个或多个订阅者接收来自这个消息主题的消息
在这种模型下,发布者和订阅者彼此不知道对方。实际操作过程中,发布订阅消息模型中,支持向一个特定的主题Topic发布消 息,0个或多个订阅者接收来自这个消息主题的消息


RabbitMQ是点对点的消息队列模型,但是可以通过路由进行配置实现发布订阅。如下图所示:

 


消息的顺序性保证

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

 

消息的ACK确认机制

即消息的Ackownledge确认机制, 为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制:

当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消息了
如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理

类似于TCP的ACK机制

 

消息的持久化

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

 

消息的同步和异步收发

同步:消息的收发支持同步收发的方式
同时还有另一种同步方式:同步收发场景下,消息生产者和消费者双向应答模式,例如: 张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站,然后张三去取,当然张三写信的时候就得写明回信地址消息的接收如果以同步的方式(Pull)进行接收,如果队列中为空,此时接收将处于同步阻塞状态,会一直等待,直到消息的到达
异步:消息的收发同样支持异步方式:
异步发送消息,不需要等待消息队列的接收确认
异步接收消息,以Push的方式触发消息消费者接收消息

 

消息的事务支持

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


 

Linux编程:--消息队列(MessageQueue)相关概念和原理


推荐文章
Mac下搭建react开发环境

安装node 官网下载 https://nodejs.org/en/ 双击安装,接下来都是默认选择即可,直至安装成功 测试是否安装成功,分别输入以下命令: node-v npm-v 如下

关于在linux系统下安装jdk

    今天装jdk遇到了不少的问题,我第一次遇到64位虚拟机中居然装32位操作系统,然后遇到一系列的麻烦,差点有种崩溃的感觉; 对于版本为题是一个很关键的问题,对于jdk安装,不要认为只要java

Linux学习笔记——硬盘分区和安装双系统

1.前言  假设电脑上已经安装了windowsXP或者windows7。试图在使用windows的同时,在电脑上安装ubuntu。  假设电脑上已经存在C盘、D盘、E盘和F盘,且E盘和F盘的剩余空间较

linux文件内容查看命令

~~~~~~~1、cat 正序查看文件  1)cat>>文件名   创建一个文件  2)cat  文件名    查看文件 2、tac 倒序查看文件  1)tac 文件名 3、nl添加行号查看  1)n

Linux下设置环境变量

setenv(setenvironment variable)功能说明:查询或显示环境变量。语  法:setenv [变量名称][变量值]补充说明:setenv为tsch中查询或设置环境变量的指令。

eclipse常用快捷键

Ctrl+T 得到接口的实现类Ctrl+Shift+T 查找类Cril+H查找eclipse常用快捷键,布布扣,bubuko.comeclipse常用快捷键

会话缓存(Session Cache)?

最常用的一种使用Redis的情景是会话缓存(sessioncache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如

安装VMWare tools,踩坑。记录一下

对于没钱买服务器的小白,只能靠安装虚拟机来勉强度日子。最近比较闲,想实现一下docker的自动化部署,在制作java8镜像时出了个问题。就是怎么在虚拟机上实现与本机文件夹的共享。坑了2天。记录一下,环

(赵小明RHCE笔记)linux基础之一

默认情况下,linux有一个图形界面,五个文本虚拟终端[email protected]#tty 用来查看当前是在哪个tty下ctrl+alt+F1-F7用来切换不同终端startx命令用来启动图形化

Shell高级用法-----函数(function)

函数介绍(function用法)1、function用法1、函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。2、它与shell程序形式上是相似的,不同的是它不是一个

【Linux】crontab 每隔1小时 2小时的执行job写法

crontab-l crontab-e   每五分钟执行 */5**** 每小时执行    0**** 每2小时执行    0*/2*** 每天执行       00*** 每周执行  

Linux系统root密码修改

   重启系统。   进入系统引导界面:      按下e键:      选择第二项,内核启动参数设置,按下e键:      在结尾处,输入数字1或者英文"single",再回车:      按下b键

关于eclipse的Description:Resource Path Location Type The project cannot be built until build path errors are resolved的问题

问题如上一开始安装也有问题,安装完打不开显示出错,打开eclipe的安装目录,找到eclipse.ini,在最后加上后面这么一行就好了。--add-modules=ALL-SYSTEM百度了一下,发现

vmware中ubuntu系统扩展磁盘

总体思路:对新增硬盘进行分区(新硬盘可以直接增加逻辑分区挂载目录,老硬盘先删除逻辑分区重新分区再挂载目录),对逻辑分区再进行目录挂载。虚拟机中ubuntu系统扩展磁盘有两种方式:一、添加一块新硬盘,对

《鸟哥linux》--第十一章课后习题答案

1.在linux上可以找到哪些shell?哪个档案记录可用的shell?儿linux预设的shell是?  1./bin/bash,/bin/tcsh,/bin/csh  2./etc/shells 

VMware workstation 14永久激活密钥、注册码

VMwareworkstation14永久激活密钥、注册码CG54H-D8D0H-H8DHY-C6X7X-N2KG6ZC3WK-AFXEK-488JP-A7MQX-XL8YFAC5XK-0ZD4H-0

linux基础命令学习(一)

pwd输出当前工作路径tree以树状图列出目录的内容ctrl+c取消命令的执行clear 清空屏幕ls列出文件目录蓝色是目录,白色是普通文件aliascls=clear 别名终端:本地终端、远程虚

[Linux]调整swap

在启动Tomcat的过程中,tomcat/catalina.out中报出如下故障:>/opt/govern/wydaas/logs/catalina.out #Thereisinsufficientm

Linux环境下安装yum

 若出现以下错误则代表需要重新安装yum: ThissystemisnotregisteredtoRedHatSubscriptionManagement.Youcanusesubscription

【原创】Linux中断子系统(四)-Workqueue

背景 Readthefuckingsourcecode!--By鲁迅 Apictureisworthathousandwords.--By高尔基 说明: Kernel版本:4.14 ARM64处理器,