RabbitMQ系列-简介

2023-11-05

RabbitMQ 简介

RabbitMQ 介绍

人如其名,除了像兔子一样跑的很快以外,具有以下特点:
1.开源、性能优秀,稳定性保障
2.提供可靠性消息投递模式、交互模式
3.与Spring AMQP完美整合,API丰富(spring-boot融合)
4.集群模式丰富,表达式配置,HA模式,镜像队列模型(稳定可靠)
5.保证数据不丢失的前提做到高可靠性、可用性(稳定可靠)

RabbitMQ 工作原理

在这里插入图片描述
组成部分说明如下:

Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
消息发布接收流程:

—–发送消息—–

1、生产者和Broker建立TCP连接。

2、生产者和Broker建立通道。

3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。

4、Exchange将消息转发到指定的Queue(队列)

—-接收消息—–

1、消费者和Broker建立TCP连接

2、消费者和Broker建立通道

3、消费者监听指定的Queue(队列)

4、当有消息到达Queue时Broker默认将消息推送给消费者。

5、消费者接收到消息。

典型应用场景:

异步处理

系统暂时把消息放入消息中间件中,等到需要的时候再去处理。先返回消息确认ID,然后再进行消息处理
eg 1.注册,注册会记住用户的信息,但是当前用户的注册线索可以被销售进行统计,这是后面无关紧要要做的事情,可以发消息进行异步处理,注册流程已经完成,用户无感知后面的逻辑
eg 2.会员,用户注册会员后,会发邮件或者短信恭喜用户,这些是不必要的事情,如果采用串行方式,先注册,等待邮件,等待短信,反馈用户注册成功,异步时候,注册完成,反馈用户,邮件、短信异步消息处理,简化流程

流量削峰

秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
eg 1.秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
可以控制活动人数,超过此一定阀值的订单直接丢弃
可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)

应用解耦

eg 1.某个服务A需要给许多个服务(B、C、D)发送消息
此时,当服务B 不需要发送消息了,服务A需要改代码再次部署;
下次,当新加入一个服务E 需要服务A的消息的时候,也需要改代码重新部署;
另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?
使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。
eg 2.订单系统
用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口,如果库存有问题,那就要回滚,导致订单失败
采用MQ消息队列,用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。用户美滋滋
库存系统:订阅下单的消息,获取下单消息,进行入库操作,就算库存系统出现故障,消息队列持久化可靠性也能保证消息的可靠投递,不会导致消息丢失,完美解耦

RabbitMQ 组件介绍

在这里插入图片描述

Queue

消息队列,提供了FIFO的处理机制,具有缓存消息的能力。rabbitmq中,队列消息可以设置为持久化,临时或者自动删除。

  1. 持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统断电crash,数据丢失
  2. 临时队列,queue中的数据在系统重启之后就会丢失
  3. 自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除
Exchange

Exchange类似于数据通信网络中的交换机,提供消息路由策略。Rabbitmq中,producer不是通过信道直接将消息发送给queue,而是先发送给Exchange。
一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY,Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue。和Queue一样,Exchange也可设置为持久化,临时或者自动删除。

Exchange有4种类型:

1. Direct

直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue

2. Fanout

广播是式交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。

3. Topic

主题交换器,工作方式类似于组播,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列,比如,ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 * .stock,user.stock, * . * 和 #.user.stock.#的队列。
( * 表是匹配一个任意词组,#表示匹配0个或多个词组)

4. Headers

消息体的header匹配(ignore)

Binding

所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定可以是多对多的关系。

Virtual host

在rabbitmq server上virtual hosts (vhosts)。每一个vhost本质上是一个rabbitmq server,分别管理各自的exchange和bindings。vhost 和 rabbitmq的关系就像 是mysql和数据库的关系, vhost就是数据库,一个mysql可以包含多个独立的数据库, vhost 实现租户隔离,不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个 vhost。
下一篇介绍
RabbitMQ系列(一)启动及网页、外网访问配置

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ系列-简介 的相关文章

  • 装修调度系统

    我想使用多个处理器并行执行线性运算 将复杂的数学函数拟合到某些数据集 假设我的机器有 8 个核心 我想要容纳 1000 个数据集 我期望的是某个系统将 1000 个数据集作为队列 并将它们发送到 8 个核心进行处理 因此它首先将 1000
  • 需要帮助 Discord 机器人队列

    我一直在尝试为不和谐机器人和我的 gt q命令基本上工作为join play queue同时 问题是它只能同时对 2 首歌曲进行排队 所以我需要帮助使其对多首歌曲进行排队 queues check queue def check queue
  • RabbitMQ 启动失败

    RabbitMQ Windows 服务将无法启动 C Program Files x86 RabbitMQ Server rabbitmq server 3 0 4 sbin gt rabbitmq service bat start C
  • Spring AMQP RabbitMQ 如何直接发送到Queue而不需要Exchange

    我正在使用 Spring AMQP 和 Rabbitmq 模板 如何直接将消息发送到队列而不使用Exchange 我该怎么做 我该怎么做 你不能 发布者不知道队列 只是交换和路由密钥 但是 所有队列都绑定到默认交换器 以队列名称作为其路由键
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • NestJS Bull 队列:如何跳过测试环境中的处理?

    我在用着通过 Bull 的 NestJS 队列 https docs nestjs com techniques queues并用 Jest 编写单元测试 我想跳过测试期间触发的作业的处理 存在 GH 问题Bull 的测试模式 https
  • Celery 任务状态取决于 CELERY_TASK_RESULT_EXPIRES

    据我所知 任务状态完全取决于 CELERY TASK RESULT EXPIRES 设置的值 如果我在任务完成执行后检查此间隔内的任务状态 则返回的状态为 AsyncResult task id state 是正确的 如果没有 状态将不会更
  • Java 中保存最后 N 个元素的大小受限队列

    关于 Java 库的一个非常简单快速的问题 是否有一个现成的类可以实现Queue具有固定的最大大小 即它始终允许添加元素 但它会默默地删除头元素以为新添加的元素提供空间 当然 手动实现它很简单 import java util Linked
  • 使用 RabbitMq 锁定和批量获取消息

    我正在尝试以一种更非常规的方式使用 RabbitMq 尽管此时我可以根据需要选择任何其他消息队列实现 消费者不会将 Rabbit 推送消息留给我的消费者 而是连接到一个队列并获取一批 N 条消息 在此期间它会消费一些消息 并可能拒绝一些消息
  • Celery 与rabbitmq 创建结果多个队列

    我已经用 RabbitMQ 安装了 Celery 问题是 对于返回的每个结果 Celery 都会在 Rabbit 中创建队列 并在交换 celeryresults 中使用任务 ID 我仍然想得到结果 但在一个队列上 我的芹菜配置 from
  • 用于 SQL 更新语句的 Java 单工作线程

    我正在开发一个基于 Java 的服务器 其中有多个线程 每个连接的用户一个线程 一些额外的线程 会涉及到一些数据库连接 所以我在想服务器每次创建一个SELECT查询数据库时 它将为此启动一个新线程 以防止当前线程阻塞 我计划为此使用连接池
  • 在 Celery 工作线程中捕获 Heroku SIGTERM 以优雅地关闭工作线程

    我对此进行了大量研究 令我惊讶的是我还没有在任何地方找到一个好的答案 我正在 Heroku 上运行一个大型应用程序 并且我有某些运行很长时间处理的 celery 任务 并在任务结束时保存结果 每次我在 Heroku 上重新部署时 它都会发送
  • 使用 Java 中的映射实现的队列数据结构,大小限制为 5

    我有带有一些记录的地图 我想将该映射限制为仅 5 个元素 并且每当添加新元素时 应删除第一个元素 并应在映射的最后位置添加新元素 类似于 FIFO 的东西 任何人都可以建议我使用一个数据结构或解决方案本身 E g Map
  • MassTransit 生成我想忽略的_skipped 队列

    任何人都可以猜出问题是什么 因为我不知道如何解决这个问题 大众运输产生 skipped队列 我不知道为什么它会生成这些队列 它是在执行发布请求响应时生成的 请求客户端是使用 MassTransit RequestClientExtensio
  • AMQPRuntimeException:读取数据时出错。收到 0 而不是预期的 7 字节

    它曾经有效 但现在不再有效了 我正在使用 php amqplib 和 RabbitMQ 当我尝试创建新的 AMQP 连接时 connection new AMQPConnection localhost 5672 username pass
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • Amazon EC2 实例上和本地的 RabbitMQ?

    是否可以设置一个RabbitMQ服务器上的Amazon EC2 instance 并将我办公室的机器连接到此RabbitMQ服务器并向其发送 接收消息 我会被收取费用吗Amazon对于流入 流出我的带宽 消息RabbitMQ EC2 ins
  • 双端队列与队列速度

    我正在研究 LeetCode 上的一个问题 Here https leetcode com problems moving average from data stream 当我完成这个问题后 我想出了 class MovingAverag

随机推荐

  • Hbase基础入门

    HBase 1 HBase是什么 1 1 HBase的概念 1 2 HBase的特点 2 HBase集群安装部署 2 1 准备安装包 2 2 修改HBase配置文件 2 2 1 hbase env sh 2 2 2 hbase site x
  • RocketMQ入门

    1 认识MQ 1 1 什么是MQ MQ全称为Message Queue 即消息队列 是一种提供消息队列服务的中间件 也称为消息中间件 是一套提供了消息生 产 存储 消费全过程的软件系统 遵循FIFO原则 1 2 为什么用MQ 并发量高时 当
  • 微信小程序 组件生命周期

    完整微信小程序 Java后端 技术贴目录清单页面 必看 组件的生命周期 指的是组件自身的一些函数 这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发 其中 最重要的生命周期是 created attached detached 包含
  • yolov5详解与改进

    https github com z1069614715 objectdetection script YOLOV5改进 Optimal Transport Assignment Optimal Transport Assignment O
  • 49天精通Java,第43天,缓冲区数据结构bytebuffer

    目录 专栏导读 一 缓冲区 二 常用方法 三 通道获取 1 从 FileInputStream FileOutputStream 中获取 2 从 RandomAccessFile 中获取 3 通过 FileChannel open 获取 四
  • 如何创建A/B Test谷歌广告实验(3种类型)

    为了更精细化的测试广告 我们需要做一些测试 谷歌广告实验 我们也经常会叫A B Test 目前谷歌支持搜索广告 展示广告和视频广告三种广告系列类型的A B Test 在谷歌广告实验中分为广告变体 自定义实验和视频实验三种类型 广告变体主要用
  • Hadoop集群完全分布式搭建

    本人也只是hadoop学习的一个萌新 在这段时间内因为课程的需要 安装了一下hadoop集群 里面遇到了一些问题 找到了一些解决办法 如果文章内有什么错误 欢迎大家与我交流 下面就开始搭建hadoop集群吧 搭建环境为win10 虚拟机为V
  • 在Linux环境搭建Java版Minecraft(我的世界)服务器

    文章目录 前言 一 帮助轻松开服的工具 1 Xshell 2 XFTP 二 开服步骤 1 准备一个可以满足你需要的Linux服务器 2 安装工具 3 连接服务器 4 配置服务器 确保你已经完成第三步 成功连接上了服务器 1 安装Java 如
  • HDFS入门和应用开发场景案例:如何模拟实现分布式存储?

    如何解决海量数据存的下问题 1 传统式存储方式 应对文件存储服务 传统做法是在服务器上部署文件服务比如FTP 但是随着数据变多 会遇到存储瓶颈 此时 本能的操作反应是 内存不够加内存 磁盘不够加磁盘 单机纵向扩展 但是单机能够扩展的内存磁盘
  • 使用Python进行名片OCR(识别姓名,职务,电话,Email邮箱)

    上一篇博客介绍了如何通过以下方式自动OCR和扫描收据 检测输入图像中的接收 应用透视变换以获得收据的自顶向下视图 利用Tesseract对收据上的文本进行OCR 使用正则表达式提取价格数据 这篇博客将介绍如何使用Python对名片进行OCR
  • JAVA面试题 整合版

    1 List Set和Map 的区别 List 以索引来存取元素 有序的 元素是允许重复的 可以插入多个null Set 不能存放重复元素 无序的 只允许一个null Map 保存键值对映射 List 底层实现有数组 链表两种方式 Set
  • 无需MS Office!使用Aspose在C ++中以编程方式将 DOCX 转换为 DOC

    Microsoft Word 文档有两种格式 DOC 和 DOCX DOC 是一种较旧的格式 而 DOCX 是它的继任者 可以将 DOCX 文件转换为 DOC 格式 反之亦然 在本文中 将学习如何将 DOCX 文件转换为 DOC 格式以及如
  • Guava学习之Multisets

    今天谈谈Guava类库中的Multisets数据结构 虽然它不怎么经常用 但是还是有必要对它进行探讨 我们知道Java类库中的Set不能存放相同的元素 且里面的元素是无顺序的 而List是能存放相同的元素 而且是有顺序的 而今天要谈的Mul
  • 【软考初级指南】软考网络管理员如何备考通过,一个月足矣。

    文章目录 写在前面 涉及知识 1 前期准备 A 教材重难点 小于一个星期 B 远古真题测试 一周时间 2 温习阶段 一周时间 A 常错知识点文章整理 B 错题集的整理 3 冲刺刷题 一周时间 A 近几年真题 B 近几年调整 4 考场复习 写
  • Qt制作一个简单的电子时钟

    电子时钟 新建桌面应用程序 项目名LCDClock 类名Clock 基类QDialog 取消产生界面文件 当前项目添加C 类DigitalClock 基类QLCDNumber 编辑digitalclock h文件 clock h ifnde
  • 动手学深度学习_个人笔记01_李沐(更新中......)

    序言 神经网络 本书中关注的DL模型的前身 被认为是过时的工具 深度学习在近几年推动了CV NLP和ASR等领域的快速发展 关于本书 让DL平易近人 教会概念 背景和代码 一种结合了代码 数学和HTML的媒介 测试深度学习 DL 的潜力带来
  • 桌面点击:右键点击-显示设置,提示“该文件没有与之关联的程序来执行该操作“解决方法总结

    解决方法1 解决了我的问题的方案 1 WIN R组合键 运行 输入regedit 2 打开注册表 regedit 3 定位到 HKEY CURRENT USER software classes 4 找到ms settings 5 删除或重
  • Java 接口

    目录 1 接口的概念 2 接口的格式 3 接口的使用 4 接口的特性 4 1接口是一种引用类型 但是不能通过直接new接口的对象 4 2接口中的方法只能public修饰 4 3接口中的方法不能在接口实现 4 4重写接口方法时 不能使用默认的
  • pytorch 将模型作为特征提取器(提取中间层特征)

    目的 需要加载自己训练好的最好模型作为一个特征提取器 也就是说需要提取最后一层全连接层输出的内容 解决方法 参考了两个方法 详见文末 设参数直接提取 准备一个toy model来说明 class MyModel nn Module def
  • RabbitMQ系列-简介

    RabbitMQ 简介 文章目录 RabbitMQ 简介 RabbitMQ 介绍 RabbitMQ 工作原理 典型应用场景 异步处理 流量削峰 应用解耦 RabbitMQ 组件介绍 Queue Exchange 1 Direct 2 Fan