MQ和RabbitMQ知识点整理

本文介绍了MQ的基本概念,包括消息类型、消息队列、生产者和消费者,以及队列和通道的特性。重点讨论了RabbitMQ的Connection、ConnectionFactory和Channel,强调了消息确认和持久化的重要性,以及Exchange的四种类型和路由策略。同时,提到了MQ的通讯模式,如点对点、多点广播和发布/订阅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MQ:message queue ,消息队列

消息分为两种类型,非永久性(non-persistent)消息和永久性(persistent)消息

非永久性消息是存储在内存中的

永久性消息(持久化消息)主要是指:MQ down或者MQ所在的服务器down了,消息不会丢失的机制。

 

producer:消息生产者

consumer:消息消费者

队列是消息的安全存放地,队列存储消息直到它被应用程序处理。队列分为很多种类型,其中包括:本地队列、远程队列、模板队列、动态队列、别名队列等。

 

通道是MQ系统中队列管理器之间传递消息的管道,它是建立在物理的网络连接之上的一个逻辑概念,也是MQ产品的精华。

主要有三大类通道类型,即消息通道,MQI通道和Cluster通道。

消息通道是用于在MQ的服务器和服务器之间传输消息的,该通道是单向的,

MQI通道是MQ Client和MQ Server之间通讯和传输消息用的,它的传输是双向的。

群集(Cluster)通道是位于同一个MQ 群集内部的队列管理器之间通讯使用的。

 

建立一条从系统A到系统B的消息通道,消息通道代理将从传输队列中读取消息,并传递这条信息到系统B,然后等待确认。只有MQ接到系统B成功收到信息的确认之后,它才从传输队列中真正将该信息删除。如果通讯线路不通,或系统B不在运行,信息会留在传输队列中,直到被成功地传送到目的地。这是MQ最基本而最重要的技术--确保信息传输,并且是一次且仅一次(once-and-only-once)的传递。

 

通讯模式:

1) 点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一、一对多、多对多、多对一等多种配置方式,支持树状、网状等多种拓扑结构。

2) 多点广播:即能够将消息发送到多个目标站点(Destination List)。可以使用一条MQ指令将单一消息发送到多个目标站点,并确保为每一站点可靠地提供信息。
在将一条消息发送到同一系统上的多个用户时,MQ将消息的一个复制版本和该系统上接收者的名单发送到目标MQ系统。目标MQ系统在本地复制这些消息,并将它们发送到名单上的队列,从而尽可能减少网络的传输量。

3) 发布/订阅(Publish/Subscribe)模式:发布/订阅功能使消息的分发可以突破目的队列地理指向的限制,使消息按照特定的主题甚至内容进行分发,用户或应用程序可以根据主题或内容接收到所需要的消息。

4) 群集(Cluster):为了简化点对点通讯模式中的系统配置,MQ提供Cluster(群集)的解决方案。群集类似于一个域(Domain),群集内部的队列管理器之间通讯时,不需要两两之间建立消息通道,而是采用群集(Cluster)通道与其它成员通讯,从而大大简化了系统配置。此外,群集中的队列管理器之间能够自动进行负载均衡,当某一队列管理器出现故障时,其它队列管理器可以接管它的工作,从而大大提高系统的高可靠性。

 

RabbitMQ

Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。

ConnectionFactory为Connection的制造工厂。

Channel是我们与RabbitMQ打交道的最重要的一个接口,大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

Message acknowledgment:消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除。

如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者)进行处理。不存在timeout。pub message是没有ack的。

存在的问题:如果我们的开发人员在处理完业务逻辑后,忘记发送回执给RabbitMQ,这将会导致严重的bug——Queue中堆积的消息会越来越多;消费者重启后会重复消费这些消息并重复执行业务逻辑。

Message durability:消息持久化

Prefetch count:通过设置prefetchCount来限制Queue每次发送给每个消费者的消息数。

生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中(或者丢弃)。

Binding将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了。

在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key;

生产者在将消息发送给Exchange的时候,一般会指定一个routing key。

RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种。

fanout:会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 

direct:会把消息路由到那些binding key与routing key完全匹配的Queue中。 

topic:在匹配规则上进行了扩展,与direct类型的Exchage相似,也是将消息路由到binding key与routing key相匹配的Queue中,支持模糊匹配。

句点号“. ”是分隔符,“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。

headers:根据发送的消息内容中的headers属性进行匹配。

备注:以上内容是从其他技术博客中摘抄过来的,例如:https://www.sojson.com/blog/48.html、百度百科等。

 

下面的图片是我对RabbitMQ发送接收消息过程的理解:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值