RabbitMQ系列(1)--RabbitMQ概述与背景

RabbitMQ系列(1)--RabbitMQ概述与背景,第1张

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,或者简单地将作业队列以便让分布式服务器进行处理

它现实了AMQP协议,并且遵循Mozilla Public License开源协议,它支持多种语言,可以方便的和spring集成

消息队列使用消息将应用程序连接起来,这些消息通过像RabbitMQ这样的消息代理服务器在应用程序之间路由

AMQP:advanced Message Queuing Protocol(高级消息队列协议)
2004年开发
从一开始就设计成为开发标准,以解决众多的消息队列需求和拓扑结构问题
凭借开放,任何人都可以执行这一标准,针对标准编码的任何人都可以和任意AMQP供应商提供的MQ服务器进行交互

兔子是行动非常迅速的动物而且繁殖起来也非常疯狂

(注:内容整理自《RabbitMQ实战》)

第一种解释:IBM MQ
介绍:
消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
IBM WebSphere MQ 产品支持应用程序通过不同组件如处理器、子系统、 *** 作系统以及通信协议的网络彼此进行通信。例如,IBM WebSphere MQ 支持 35 种以上的不同 *** 作系统。
IBM WebSphere MQ 支持两种不同的应用程序编程接口:Java 消息服务(JMS)和消息队列接口(MQI)。在 IBM WebSphere MQ 服务器上,JMS 绑定方式被映射到 MQI。如图 3 所示,应用程序直接与其本地队列管理器通过使用 MQI 进行对话,MQI 是一组要求队列管理器提供服务的调用。MQI 的引人之处是它只提供 13 次调用。这意味着对于应用程序编程员它是一种非常易于使用的接口,因为大部分艰苦工作都将透明完成的。
图形 2 IBM WebSphere MQ 编程
图 2 显示了 IBM WebSphere MQ 编程的原理。第一步是让应用程序与队列管理器连接。它通过 MQConnect 调用来进行此连接。下一步使用 MQOpen 调用为输出打开一个队列。然后应用程序使用 MQPut 调用将其数据放到队列上。要接收数据,应用程序调用 MQOpen 调用打开输入队列。应用程序使用 MQGet 调用从队列上接收数据。
图中还显示了消息通道代理(MCA)、通道出口和对象权限管理器(OAM)。MCA 是 IBM WebSphere MQ 程序,它使用现有传输服务诸如 TCP/IP 与 SNA 将消息从本地传输队列移到目标队列管理器。这些传输服务即通道。通道出口是用户写入库,可以在通道运作期间,从已定义位置号之一进入这些库。OAM 是命令和对象管理的缺省授权服务(针对 *** 作系统)。这三个组件对 IBM WebSphere MQ 的现有安全性解决方案非常重要。
第二种解释:
德商(MQ)
德商(Moral Intelligence Quotient,缩写成MQ),是指一个人的德性水平或道德人格品质。德商的内容包括体贴、尊重、容忍、宽恕、诚实、负责、平和、忠心、礼貌、幽默等各种美德。我们常说的“德智体”中是把德放在首位的;科尔斯说,品格胜于知识。可见,德是最重要的。一个有高德商的人,一定会受到信任和尊敬,自然会有更多成功的机会。
古人云:“得道多助,失道寡助”、“道之以德,德者得也”,就是告诉我们要以道德来规范自己的行为,不断修炼自己,才能获得人生的成功。古今中外,一切真正的成功者,在道德上大都达到了很高的水平。
现实中的大量事实说明,很多人的失败,不是能力的失败,而是做人的失败、道德的失败。

可以在windows下的MQ队列管理器中点右键选择“显示队列管理器”,打开后选择“显示远程队列管理器”,输入远程LINUX下的队列管理器名称和远程LIUNX系统的IP地址,就可以查看了。

网络问题、服务器问题。
1、网络问题。因为网络不畅,在网络信号微弱的时候就容易发生打开mq队列失败的现象,可以换网络重新加载。
2、服务器问题。mq的服务器出现问题,这时可以将mq的服务器关闭,重新打开,就解决问题了。

一、消费端限流

1什么是消费端的限流

假设一个场景,首先,Rabbitmq服务器有上万条未处理的消息,我们随便打开一个消费者客户端,就会出现:巨大的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这么多数据!

2RabbitMQ提供了一种Qos(服务质量控制)功能,即在非自动确认消息的前提下,如果一定数目的消息(通过基于consume或者channel设置Qos的值)未被确认前,不进行消费新的消息。

void BasicQos(uint prefetchSize,ushort prefetchCount,bool global);

prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ACK,则该comsumer将block掉,直到有消息ack

global:true/false 是否将上面的设置应用于channel,就是限制是channel级别还是consumer级别

二、消费端的手动ACK和NACK

消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿!

如果由于服务器宕机等严重问题,那我们就需要手动进行ACK保障消费端消费成功!

三、消费端的重回队列

1消费端重回队列是为了对没有处理成功的消息,把消息重新会递给Broker

2一般我们在实际应用中,都会关闭重回队列,也就是设置为false

四、TTL队列/消息

1TTL

TTL:time  to live 的缩写,也就是生存时间

RabbitMQ支持消息的过期时间,在消息发送时可以进行指定

RabbitMQ支持队列的过去时间,从消息入队列开始计算,只要超过了队列的超时时间配置,那么消息会自动删除

2DLX

DLX:Dead-Letter-Exchange,死信队列

利用DLX,当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX

DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性

当一个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列

可以监听DLX这个队列中的消息做相应的处理,这个特性可以弥补RabbitMQ30以前支持的immediate参数的功能

3消息变成死信的情况

消息被拒绝(basicreject/basicnack),并且requeue=false

消息TTL过期

队列达到最大长度

4DLX死信队列设置

首先需要设置死信队列的exchange(dlxexchange)、queue(dlxqueue)和路由规则(RoutingKey:#),然后进行绑定

然后进行正常交换机、队列、绑定,只不过我们需要在队列上加上一个参数即可:argumentsput("x-dead-letter-exchange","dlxexchange");


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zz/10268996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-07
下一篇 2023-05-07

发表评论

登录后才能评论

评论列表(0条)

保存