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系列-简介 的相关文章

  • RabbitMQ Java 客户端自动重新连接

    当我的应用程序失去与 RabbitMQ 的连接时 我将其连接工厂设置为自动尝试并重新连接 ConnectionFactory factory new ConnectionFactory factory setUsername usernam
  • 如何重置rabbitmq管理用户

    使用rabbitmq 我们可以安装管理插件 然后我们通过浏览器访问http localhost 55672 使用访客 访客 问题是 我无法再登录 因为我更改了密码并为角色输入了空白 有没有办法重置rabbitmq管理的用户 您可以通过以下方
  • RabbitMQ:如何创建和恢复备份

    我是 RabbitMQ 的新手 我需要一些帮助 如何备份和恢复到RabbitMQ 以及我需要保存哪些重要数据 谢谢 如果您安装了管理插件 您可以在Overview页 在底部你会看到导入 导出定义您可以使用它来下载代理的 JSON 表示形式
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • 从队列更新活动的最佳方法

    我有一个LinkedBlockingQueue在我的 生产者 调解者 消费者 模型中的调解者中 Producer 首先更新将 Mediator 添加到 ActivityQueue 中 接下来 消费者 活动在队列中等待 侦听并获取下一个项目
  • Rabbit mq - 等待 Mnesia 表时出错

    我已经在 Kubernetes 集群上使用 Helm Chart 安装了 RabbitMQ rabbitmq pod不断重新启动 在检查 pod 日志时 我收到以下错误 2020 02 26 04 42 31 582 warning lt
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe
  • C#:将对象添加到队列时触发事件

    每当一个对象被添加到一个对象时 我需要能够触发一个事件Queue
  • 是否可以更改队列中的元素?

    假设我有一个整数队列 或任何 T 类 我可以更改队列中元素的值吗 更具体地说 如果我将队列定义如下 Queue
  • 在 PL/SQL 中创建队列订阅者的语法是什么?

    我正在尝试创建一个队列和一个在消息排队时触发的回调 但我无法触发回调 我究竟做错了什么 我有一个将消息入队的触发器 我可以在队列消息表上看到它 我可以手动将其出队并处理它 我只是无法在入队时触发回调 BEGIN DBMS AQADM CRE
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • queue.empty 并在空时执行 put

    假设我有一个包含两个元素的队列 我使用 get 循环遍历队列弹出项目 我担心一旦弹出第二个元素 循环就会停止循环 并且由于某些错误 我需要重新处理它 所以我把它放回队列中 但它不会 因为那时队列是空的 My loop while not q
  • Firebase/Firestore 事务是否会创建内部队列?

    我想知道交易是否 https firebase google com docs firestore manage data transactions https firebase google com docs firestore mana
  • 启动时加载 RabbitMQ 配置

    如何在启动时加载 RabbitMQ 配置以确认已创建代理对象 队列 交换 绑定 用户 虚拟主机 权限和参数 根据 RabbitMQ 文档 可以通过以下方式完成load definitions http www rabbitmq com ma
  • Dart 中的 DoubleLinkedQueue 和 ListQueue 有什么区别?

    Dart 核心 API 有两个类实现Queue
  • std::queue 初始化为 NULL

    是否可以初始化一个C std queue with a NULL像其他变量一样的值 像这样 HANDLE variable NULL class Test i e std queue
  • RabbitMq 和“致命错误:握手失败 -handshake_decode_error”

    我正在使用 Windows Server 2012 Erlang 19 2 和 RabbitMq 3 6 6 我在使用 TLS 配置端点之间的连接时遇到问题 我已经尝试了所有关于 SO 的答案 以及所有 RabbitMq 文档here ht
  • RabbitMQ-在一个应用程序进程中为单个队列创建多个消费者是一种好习惯吗

    我刚刚处理一个由 RabbitMQ 支持的新项目 并且在应用程序启动时创建了多个监听同一个队列的消费者实例 然而 它们与不同的渠道共享相同的连接 来自队列的消息非常庞大 一次生成行为有数百万条消息 因此我猜第一个代码作者正在尝试做一些事情来

随机推荐

  • 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