中间件RabbitMQ-了解RabbitMQ七种工作队列模式

一、RabbitMQ基本介绍

RabbitMQ是实现了高级消息队列协议AMQP的开源消息代理软件(亦称面向消息的中间件),主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全,并且RabbitMQ服务器是使用Erlang语言编写的。
支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

  • RabitMQ官方网站:

https://www.rabbitmq.com/

  • AMQP协议工作核心思想

AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到对队列中,只是将消息发送到一个交换机(Exchange)。先由交换机(Exchange)来接收,然后交换机(Exchange)按照特定的策略转发Queue进行存储。同理,消费者也是如此。交换机(Exchange),转发各个消息分发到对应的队列。

  • AMQP协议的真正本质

所有中间件技术都是基于TCP/IP 协议基础之上构建的新的协议规范,在TCP/IP协议无法满足当前规范时,基于TCP/IP 协议做封装,命名一种新的规范叫做AMQP协议。

二、RabbitMQ的七种工作队列模式

在RabbitMQ官方文档中,为我们提供了七种工作队列模式,作为开发者我们重点掌握前5种常用的即可如下:

最新版7种工作队列入门指南: https://www.rabbitmq.com/getstarted.html

重点掌握前5种模式: simple、work queues、publisc/subscribe、routing、topics

2021-04-27_RabbitMQ

1、simple:简单模式即点对点的队列模式

2、Work queues: 工作队列,即公平性队列

3、Publish/Subscribe:发布订阅(共享资源)

4、Routing:路由模式

5、Topics:主题模式(路由模式的一种)

6、RPC: 消息拉取的机制,很少用,暂不介绍

7、Publisher Confirms: 消息的发布确认模式

三、Simple简单队列(点对点)

1. 角色

一个生产者P,一个消费者C,(其实还有一个默认的交换机),红色的部分代表队列queue

2. 原理

简单队列

P: 代表消息生产者

C:代表消息消费者

队列: 上图中红色部分

  • 流程:
  1. Producer消息产生者将消息放入队列中,此时采用的是默认交换机
  2. Consumer消息的消费者,监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)应用场景:聊天(中间有一个过度的服务器;p端,c端)

四、Work queues工作模式(资源的竞争)

1. 角色

一个生产者P,多个消费者C1、C2,消息被多个消费者竞争接收。(其实还有一个默认的交换机),红色的部分代表队列queue

2. 原理

在这里插入图片描述

P: 代表消息生产者

C1/C2:代表消息消费者

队列: 上图中红色部分

  • 流程:
  1. 在传统队列中各个消费者Consumer是均摊消息来消费的,存在不公平性;如果每个消费者速度不一样的情况下,均摊消费是不公平的,应该是能者多劳,RabbitMQ的Work queues就是能者多劳模式。
  2. 一条消息只会被一个消费者接收;
  3. 消息产生者Producer将消息放入队列,消费者Consumer可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费C1 、C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(有隐患存在,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)。
  4. 应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度,根据消费者消费能力不同,能者多劳,采用工作模式最合适。

五、Publish/Subscribe发布订阅(共享资源)

生产者发送一条消息,经过交换机转发到多个不同的队列,多个不同的队列就多个不同的消费者。

1. 角色

一个生产者P,多个消费者C1、C2,X代表交换机消息复制多份,每个消费者接收相同的消息,红色的部分代表队列queue

2. 原理

在这里插入图片描述

P: 代表消息生产者

X:代表交换机

C1/C2:代表消息消费者

队列: 上图中红色部分

3. 示例:

img

  • 需要创建两个队列 ,每个队列对应一个消费者,每个消费者监听自己的队列;

  • 生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

六、Routing路由模式(布订阅基础上增加一个路由key)

在这里插入图片描述

路由模式:

1、 每个消费者监听自己的队列,并且设置routingkey.

2、生产者Producer发送消息到交换机并且要指定路由key,根据队列绑定的路由键转发到具体的队列中存放消息。

Routing模式和Publish/subcribe模式的区别?

Routing模式要求队列在绑定交换机时要指定routingkey,消息会转发到符合routingkey的队列。

七、Topics模式(增加了模糊的路由key,可模糊匹配)

在这里插入图片描述

  1. 星号井号代表通配符,星号代表只能匹配一个单词,井号代表匹配一个或者多个单词。
  2. 一个交换机可以绑定多个队列,每个队列可以设置一个或多个带通配符的routingkey。
  3. 生产者将消息发给交换机,交换机根据routingkey的值来匹配队列,匹配时采用通配符方式,匹配成功的将消息转发到指定的队列
  4. 消息产生者产生消息,把消息交给交换机,交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

八、总结

1. Topics与Routing的区别?

Topics和Routing的基本原理相同,即:生产者将消息发给交换机,交换机根据routingKey将消息转发给与routingKey匹配的队列。

不同之处是:routingKey的匹配方式不用,Routing模式是相等匹配,topics模式是通配符匹配。

  • 符号#:匹配一个或者多个词,比如inform.#可以匹配inform.sms、inform.email、inform.email.sms

  • 符号*:只能匹配一个词,比如inform.*,可以匹配inform.sms,inform.email

2. publish/subcribe与work queues有什么区别?

1)work queues不用定义交换机,而publish/scribe需要定义交换机。

2)publish/subcribe的生产方面向交换机发送消息,work queues的生产方是面向队列发送消息(底层使用默认交换机)。

3)publish/sucribe需要设置队列和交换机的绑定,work queues不需要设置,实质上work queues会将队列绑定到默认的交换机。

相同点:

所以两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。

2.实质工作用什么 publish/subscribe还是work queues。

建议使用publish/subcribe,发布订阅模式比工作队列模式更强大,并且发布订阅模式可以指定自己专用的交换机。

参考: https://blog.csdn.net/qq_37977218/article/details/99945043

Thinkingcao CSDN认证博客专家 Java Spring Boot 微服务
CSDN2019年度博客之星、博客专家,专注架构、Java、Spring、SpringBoot、SpringCloud、微服务、数据库、分布式、中间件、源码分析、JVM性能调优、K8S等领域
微信搜索公众号:「Thinking曹」,一个执着于架构的JAVA基层码农,每天带你学习新知识。
相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值