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发送接收消息过程的理解: