RabbitMQ的基本概念和七种队列模式

I. RabbitMQ的基本概念

1. 生产者/消费者

  • 生产者(Producer)
    消息的创建者。
    负责创建和推送数据到消息服务器。

  • 消费者(Consumer)
    消息的接收方。
    负责接收消息和处理数据。

2. 消息队列(Queue)

消息队列是RabbitMQ的内部对象,用于存储生产者的消息直到发送给消费者,它是消费者接收消息的地方。

消息队列的重要属性:

  • 持久性
    broker重启前都有效。
  • 自动删除
    在所有消费者停止使用之后自动删除。
  • 惰性
    没有主动声明队列,调用会导致异常。
  • 排他性
    -一旦启用,声明它的消费者才能使用。

3. 交换机(Exchange)

交换机用于接收,分配消息。

1. 生产者要先指定一个routing key,然后将消息发送到交换机。
2. routing key需要与exchange type和binding key联合使用才能最终生效。
3. 交换机将消息路由到一个或多个队列中,或丢弃。

交换机包含4中类型: direct, topic, fanout, headers。

  • direct(直连交换机)
具有路由功能的交换机,绑定到此交换机的时候需要指定一个routing_key,交换机发送消息的时候需要routing_key,会将消息发送道对应的队列。

先匹配,再投送

Direct Exchange是RabbitMQ的默认交换机模式。
这是最简单的模式。
它根据routing key全文匹配去寻找队列。

在绑定队列时会设定一个routing key(通常是队列的名字)。
只有在消息的routing key与队列匹配时,消息才会被交换机投送到绑定的队列中。

  • topic(主题交换机)

    在直连交换机基础上增加模式匹配,也就是对routing_key进行模式匹配,*代表一个单词,#代表多个单词。

    按规则转发消息

主题交换机(Topic Exchange)主要根据通配符转发消息。
这种方式最灵活。
交换机和队列的绑定会定义一种路由模式。
路由键(routing key)和路由模式匹配后,交换机才能转发消息。

在这种交换机模式下,路由键(routing key)必须是一串字符,用"."隔开。
路由模式必须包含一个星号"*", 主要用于匹配路由键指定位置的一个单词。
* 匹配一个单词。
# 匹配0个或多个单词。
eg:
binding key:                 *.com.#
匹配的routing key:     cn.com,  us.com.aa
不匹配:                         com.bb

  • headers(首部交换机)
    忽略routing_key,使用Headers信息(一个Hash的数据结构)进行匹配,优势在于可以有更多更灵活的匹配规则。
    根据应用程序消息的特定属性进行匹配

  • fanout(扇形交换机)
    广播消息到所有队列,没有任何处理,速度最快。
    消息广播的模式

这种方式将消息广播到所有绑定到它的队列中。
不考虑routing key的值,即使配置了路由键,依然会被忽略。


4. 消息确认

消息确认是指当一个消息从队列中投递给消费者(consumer)后,消费者会通知一下消息代理(broker)

消息确认可以自动,也可以由处理消息的开发者手动执行。
当启用消息确认后,消息代理需要收到来自消费者的确认回执后,才完全将消息从队列中删除。

 
 

II. 七种队列模式

1. 简单模式(Hello World)

做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B。

单生产者,单消费者,单队列。


应用场景:

将发送的电子邮件放到消息队列,然后邮件服务在队列中获取邮件并发送给收件人。

2. 工作队列模式(Work queues)

在多个消费者之间分配任务(竞争的消费者模式),一个生产者对应多个消费者。

适用于资源密集型任务, 单个消费者处理不过来,需要多个消费者进行处理的场景。

单生产者,多消费者,单队列。


应用场景:

一个订单的处理需要10s,有多个订单可以同时放到消息队列,

然后让多个消费者同时并行处理,而不是单个消费者的串行消费。

3. 发布订阅模式(Publish/Subscribe)

一次向许多消费者发送消息,将消息将广播到所有的消费者。

单生产者,多消费者,多队列。

应用场景:

更新商品库存后需要通知多个缓存和多个数据库。

结构如下:

  • 一个fanout类型交换机扇出两个消息队列,分别为缓存消息队列、数据库消息队列
  • 一个缓存消息队列对应着多个缓存消费者
  • 一个数据库消息队列对应着多个数据库消费者

4. 路由模式(Routing)

根据Routing Key有选择地接收消息。

多消费者,选择性多队列,每个队列通过routing key全文匹配。

发送消息到交换机并且要指定路由键(Routing key) 。
消费者将队列绑定到交换机时需要指定路由key,仅消费指定路由key的消息。

应用场景:

在商品库存中增加了1台iphone12,iphone12促销活动消费者指定routing key为iphone12 promote,
只有此促销活动会接收到消息,其它促销活动不关心也不会消费此routing key的消息。

5. 主题模式(Topics)

主题交换机方式接收消息,将routing key和模式进行匹配。

多消费者,选择性多队列,每个队列通过模式匹配。

队列需要绑定在一个模式上。
#匹配一个词或多个词,*只匹配一个词。

应用场景:

iphone促销活动可以接收主题为多种iPhone的消息,如iphone12、iphone13等。

6. 远程过程调用(RPC)

在远程计算机上运行功能并等待结果。

应用场景:

需要等待接口返回数据,如订单支付。

7. 发布者确认(Publisher Confirms)

与发布者进行可靠的发布确认,发布者确认是RabbitMQ扩展,可以实现可靠的发布。

在通道上启用发布者确认后,RabbitMQ将异步确认发送者发布的消息,这意味着它们已在服务器端处理。

应用场景:

对于消息可靠性要求较高,比如钱包扣款。

 
https://www.cnblogs.com/davidgu/p/14702449.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9478.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SSM]MyBatis常用技巧和参数处理

目录 八、MyBatis小技巧 8.1#{}和${} 8.2别名机制:typeAliases 8.3mappers ​编辑 8.4IDEA配置文件模板 8.5插入数据时获取自动生成的主键 九、MyBatis参数处理 9.1单个简单参数类型 9.2Map参数 9.3实体类参数 9.4多参数 9.5Param注解(命名…

封装一个类似微信通讯录带有字母检索功能的vue组件

这里我们直接使用scrollIntoView方法 该方法将调用它的元素滚动到浏览器窗口的可见区域 语法 element.scrollIntoView(); // 等同于element.scrollIntoView(true) element.scrollIntoView(alignToTop); //布尔参数 element.scro…

编译Android平台的OpenCV库并启用OpenCL及Contrib

1.下载好OpenCV与OpenCV_Contirb 版本: 4.7 编译主机系统: Ubuntu 20.04 LTS 准备环境与工具: ANDRIOD SDK 与 NDK ,CMAKE ,NINJA ,GCC,G++ ,MAKE 开始编译: ../opencv/platforms/android/build_sdk.py --extra_modules_path=../opencv_contrib/modules --no_samples_bu…

想知道好用的音频翻译软件有哪些?

随着全球化进程的加速和语言交流需求的增长,音频翻译软件正日益受到关注和应用。这样的软件以其高效、准确的翻译能力以及广泛的应用场景赢得了青睐。音频翻译软件具备诸多优势,如通过语音输入实时转化为文字输出,提供了便捷的写作工具&#…

1.监控分布式--zabbix

文章目录 监控分布式-zabbix、prometheus概念工作原理功能组件部署zabbix安装Nginx和PHP环境部署数据库编码安装zabbix编译安装zabbix server客户端安装zabbix agent服务 监控分布式-zabbix、prometheus 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行…

CTP WEB 100练(1/100)

考点:PHP代码审计 抓包发现source.php,访问下,出现了php代码 代码主体在这部分,满足三个条件:file不为空&file是字符串&checkFile通过 if (! empty($_REQUEST[file])&& is_string($_REQUEST[file])&am…

CentOS Linux的最佳替代方案(一)_Rocky Linux OS 8.6基础安装教程

CentOS Linux的最佳替代方案(一)_Rocky Linux OS 8.6基础安装教程 一 Rocky Linux介绍和发展历史 Rocky Linux 官网:https://rockylinux.org/ 在CentOS官方宣布停止Centos的维护之后,Centos的创始人Gregory Kurtzer宣布启动新的…

eNSP的使用

目录 配置路由器 DHCP——动态主机配置协议 工作过程: 第一种场景——PC首次获取IP地址的情况 第二种场景——pc(客户都)再次获取IP地址的情况 DHCP配置: Telnet 搭建好图后 1.看广播域(路由器有几个接口就有几…

苹果开发者账号续费流程及苹果开发者账号续费流程及下架处理

已上架的App在AppStore上无法搜索到的问题 在AppStore上搜不到已经上架的应用程序可以采取以下解决办法: 拨打iTunes提供的支持电话:4006-701-855(中国时间9:00-17:00)。发送邮件给Review团队,在iTunes Connect登录后…

【ARM】-进入和退出异常中断的过程

文章目录 ARM 处理器对异常中断的响应过程从异常中断处理程序中返回 ARM 处理器对异常中断的响应过程 ARM 指令为三级流水线:取地,译码和执行 进入中断的时候 LR PC -4 当出现异常时,ARM 内核自动执行以下操作 将 cpsr 寄存器的值保存到…

vue 访问第三方 跨域, 配置vue.config.js

目录 0 config 文件被修改 一个要重启vscode 配置文件才会生效 1 第一种 (有两种写法) 1.1 配置vue.config.js 1.2 axios 使用 1.3 终端打印 2 第二种方法 --> 错误 --> 没有运行成功 2.1 配置vue.config.js --> 就是api 不被设置成 替换为 / 2.2 axios 使用…

chatGPT如何开启 Browsing 功能,实现即时联网查询?

Openai 为每一个 chatGPT Plus 用户都开放了 Browsing 和 plugins 功能。 前者可以在 ChatGPT 觉得有必要的时候(比如你问它今天的新闻),自动联网查询,后者是第三方开发者开发的插件,数量繁多,可以解决各种…