当前位置: 首页 > news >正文

RabbitMQ总结

目录

工作模式

        简单模式

        工作队列模式

        发布订阅模式

        路由模式

        通配符模式

SpringBoot整合RabbitMQ

        项目搭建

        配置类中创建队列和交换机

        编写生产者

        编写消费者

消息的可靠性传递

死信队列

延迟队列


 

工作模式

RabbitMQ共有六种工作模式:简单模式(Simple)、工作队列模式(Work Queue)、发布订阅模式(Publish/Subscribe)、路由模式(Routing)、通配符模式(Topics)、远程调用模式(RPC,不常用,课程不对此模式进行讲解)        

        简单模式

特点:

  1. 一个生产者对应一个消费者,通过队列进行消息传递。
  2. 该模式使用direct交换机,direct交换机是RabbitMQ默认交换机。

 

        工作队列模式

与简单模式相比,工作队列模式(Work Queue)多了一些消费者,该模式也使用direct交换机,应用于处理消息较多的情况。特点如下:

  1. 一个队列对应多个消费者。
  1. 一条消息只会被一个消费者消费。
  2. 消息队列默认采用轮询的方式将消息平均发送给消费者。

 

        发布订阅模式

在开发过程中,有一些消息需要不同消费者进行不同的处理,如电商网站的同一条促销信息需要短信发送、邮件发送、站内信发送等。此时可以使用发布订阅模式(Publish/Subscribe)

 

特点:

  1. 生产者将消息发送给交换机,交换机将消息转发到绑定此交换机的每个队列中。
  2. 工作队列模式的交换机只能将消息发送给一个队列,发布订阅模式的交换机能将消息发送给多个队列。发布订阅模式使用fanout交换机
  3. 发布订阅模式兼容工作队列模式,对个消费者可以监听同一条队列

 

        路由模式

使用发布订阅模式时,所有消息都会发送到绑定的队列中,但很多时候,不是所有消息都无差别的发布到所有队列中。比如电商网站的促销活动,双十一大促可能会发布到所有队列;而一些小的促销活动为了节约成本,只发布到站内信队列。此时需要使用路由模式(Routing)完成这一需求。

 

特点:

  1. 每个队列绑定路由关键字RoutingKey
  2. 生产者将带有RoutingKey的消息发送给交换机,交换机根据RoutingKey转发到指定队列。路由模式使用direct交换机

 

        通配符模式

通配符模式(Topic)是在路由模式的基础上,给队列绑定带通配符的路由关键字,只要消息的RoutingKey能实现通配符匹配,就会将消息转发到该队列。通配符模式比路由模式更灵活,使用topic交换机

 

通配符规则:

  1. 消息设置RoutingKey时,RoutingKey由多个单词构成,中间以.分割。
  2. 队列设置RoutingKey时,#可以匹配任意多个单词,*可以匹配任意一个单词。
  3. 路由关键字的特点为由多个单词组成,中间以.()隔开

 

SpringBoot整合RabbitMQ

        项目搭建

        配置类中创建队列和交换机

        编写生产者

        编写消费者

 

消息的可靠性传递

RabbitMQ消息投递的路径为:

生产者--->交换机--->队列--->消费者

在RabbitMQ工作的过程中,每个环节消息都可能传递失败,那么RabbitMQ是如何监听消息是否成功投递的呢?

  • 确认模式(confirm):可以监听消息是否从生产者成功传递到交换机。
  • 退回模式(return):可以监听消息是否从交换机成功传递到队列。
  • 消费者消息确认(Consumer Ack):可以监听消费者是否成功处理消息。

 

死信队列

消息成为死信的情况:

  1. 队列消息长度到达限制。
  2. 消费者拒签消息,并且不把消息重新放入原队列。
  3. 消息到达存活时间未被消费。

延迟队列

延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。

例如:用户下单后,30分钟后查询订单状态,未支付则会取消订单。

但RabbitMQ中并未提供延迟队列功能,我们可以使用死信队列实现延迟队列的效果

相关文章:

  • 【每日一题Day67】LC1739放置盒子 | 找规律+贪心 二分查找
  • 【Linux】Linux项目自动化构建工具——make/Makefile
  • <Linux线程同步>——《Linux》
  • 【Array数组】面试前基础知识点深度记忆总结
  • 20221226编译Toybrick的TB-RK3588X开发板的Android12系统1-编译环境配置
  • 大话JMeter2|正确get参数传递和HTTP如何正确使用
  • 在Makefile中使用空格缩进的方法
  • 详解vue中vuex的用法
  • 利用Bat打开exe程序并传入值
  • 【iMessage苹果推群发】苹果相册推它由pushchatkey.pem和pushchatcert.pem作为单独的文件使用
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • 基于Xlinx的时序分析与约束(5)----衍生时钟约束
  • Python常见问题整理
  • Docker安装Zookeeper教程(超详细)
  • 【学习笔记12.25】动态规划入门
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Android 架构优化~MVP 架构改造
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript设计模式之工厂模式
  • Java知识点总结(JavaIO-打印流)
  • js学习笔记
  • leetcode46 Permutation 排列组合
  • Linux链接文件
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • PAT A1050
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • web标准化(下)
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 编写高质量JavaScript代码之并发
  • 关于字符编码你应该知道的事情
  • 马上搞懂 GeoJSON
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 在Unity中实现一个简单的消息管理器
  • 自动记录MySQL慢查询快照脚本
  • 自制字幕遮挡器
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #100天计划# 2013年9月29日
  • (1)bark-ml
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (4)(4.6) Triducer
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (接口自动化)Python3操作MySQL数据库
  • (三十五)大数据实战——Superset可视化平台搭建
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) 物件導向與老子思想 (OO)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *1 计算机基础和操作系统基础及几大协议
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记