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)相关概念和原理


推荐文章
[Linux]调整swap

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

linux目录结构

Linux根目录(/) FHS认为,Linux系统的根目录(/)最为重要(没有之一),其原因有以下2点: 所有目录都是由根目录衍生出来的; 根目录与系统的开机、修复、还原密切相关;因此,根目录必须包含

Linux # kubuntu 14.04 登陆界面乱码,停止,进不了系统

问题描述:             kubuntu14.04登陆界面乱码,停止,进不了系统分析思路: 解决过程: 问题总结: 参考: lubuntu登陆界面乱码,如何解决?-查看主题?Ubuntu中

linux详解sudoers

sudo使用  Linux是多用户多任务的操作系统,共享该系统的用户往往不只一个。出于安全性考虑,有必要通过useradd创建一些非root用户,只让它们拥有不完全的权限;如有必要,再来提升权限执行。

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

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

在Linux下播放与录制电视

最近,在自己的Debian7.264位系统上成功安装了圆刚AverMediaC725B视频卡驱动。于是,可以使用mplayer与mencoder来看电视与录节目了。其中,用于播放电视的命令如下: 

在Eclipse或者STS中使用SVN插件

在Eclipse/STS安装SVN插件  在STS4中默认是没有SVN插件的,需要我们手动安装SVN插件安装有两种方式,一种是在线安装,一种是离线安装但是在线安装,由于网络问题,一般很难安装成功,所以

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

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

linux命令之ss

ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的

《linux 内核完全剖析》 mktime.c

tm结构体的定义在time.h里面 structtm{ inttm_sec; inttm_min; inttm_hour; inttm_mday; inttm_mon; inttm_year; in

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

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

Hibernate的increment主键生成机制带来的问题

      最近给学校做的系统,总出现主键插入冲突的问题。主键是通过hibernate自动生成的,设置increment属性,总出现Duplicate entry的错误。搜到解决方案如下:     

linux文件内容查看命令

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

【Linux学习】Ubuntu下内核编译(一)

(1)当要执行内核配置时,输入makemenuconfig时出现错误 遇到这个问题,主要是以为没有ncurses库,而makemenconfig需要这个库,因此需要安装ncurses或者ncurse

ubuntu防火墙

安装方法 sudoapt-getinstallufw 当然,这是有图形界面的(比较简陋),在新立得里搜索gufw试试……使用方法1启用 sudoufwenable sudoufwdefaultden

linux系统开启秘钥认证登录详解

本文以已经产生好私钥和公钥为前提去讲述后续的增加秘钥认证的步骤:(秘钥的生成工具为:ssh-keygen,命令执行完后会在当前用户的家目录中生成了一个.ssh的隐藏目录,内含两个密钥文件。id_rsa

Linux 安装 SVN

搬运地址: https://www.cnblogs.com/siashan/p/9528669.html 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,

Ubuntu编译配置Opencv

一、1.下载opencv源代码2.安装编译依赖库 2.1 sudoapt-getupdate 2.2 sudoapt-getinstallcmakesudoapt-getinstalllibgtk2.

linux find命令

由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统(NFS ),find命令在该文件系统中同样有效,只你具有相应的权限。 在运

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

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