RabbitMQ笔记-RabbitMQ基本术语

RabbitMQ基本术语

相关概念;

在这里插入图片描述

生产者(Producer):投递消息。消息:消息体(payload)+标签(label);生产者把消息交给rabbitmq,rabbitmq会根据标签把消息发给感兴趣的消费者。

  • 消息体:带业务逻辑的数据
  • 标签:表述这条消息,一个交换器的名称或者一个路由键。

消费者(Consumer):接收消息。连接rabbitmq服务器,订阅到队列上。消费消息体。消息路由过程中,消息的标签会丢弃,消息体存入队列

服务节点(Broker):一个broker可以看作一个rabbitmq服务节点或者rabbitmq服务实例。

队列(Queue):rabbitmq内部对象,用于存储消息。消息只能存在队列中。多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者处理(轮询),而不是每个消费者都收到所有的消息并处理。

交换器(Exchange):生产者将消息发送到Exchange,由交换器将消息路由到一个或多个队列中,如果路由不到,或许会返回给生产者,或许直接丢弃。

路由键(RoutingKey):生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则,这个routingkey需要与交换机类型和绑定键联合使用才能最终生效。

绑定(Binding):交换器和队列通过绑定关联起来,在绑定的时候一般会指定一个绑定键,这样就知道如何正确的将消息路由到队列了

在这里插入图片描述

生产者将消息发送给交换器时,需要RoutingKey,当BindingKey和RoutingKey相匹配时,消息会被路由到对应的队列中。绑定多个队列到同一个交换器的时候,这些绑定允许使用相同的BindingKey。

例如

  • 交换器相当于投递包裹的邮箱
  • RoutingKey相当于填写在包裹上的地址
  • BindingKey相当于包裹的目的地
  • 当地址和实际想要的投递的地址匹配:正确投递到目的地,最后这个目的地的主人-队列可以保留这个包裹
  • 地址不匹配:不能正确投递,可能退回,也可能被丢弃

交换器类型

fanout

会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中

direct

会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。

topic

将消息路由到BindingKey和RoutingKey想匹配的队列中,但匹配规则有些不同

  • RoutingKey为“.”分割的字符串,分隔的每一段独立的字符串成为一个单词
  • BindingKey和RoutingKey一样也是“."分隔的字符串
  • BindingKey中可以存在了两种特殊字符串”*“和”#“,用于做模糊匹配

headers

根据发送的消息内容中的headers属性进行匹配

RabbitMQ运转流程

生产者发送消息

  • 生产者连接到rabbitmq broker,建立一个连接,开启一个信道
  • 生产者声明一个交换器,并设置相关属性(交换机类型,是否持久化)
  • 生产者声明一个队列并设置相关属性(是否排他,是否持久化等)
  • 生产者通过路由键将交换器和队列绑定起来
  • 生产者发送消息至rabbitmq broker,包含路由键,交换器等
  • 响应的交换器根据接收到的路由键查找相匹配的队列
  • 如果找到,则将从生产者发送过来的消息存入相应的队列中
  • 如果没有找到,根据生产者配置的属性选择丢弃还是回退给生产者
  • 关闭信道
  • 关闭连接

消费者消费

  • 消费者连接到rabbitmq broker ,建立一个连接,开启一个信道
  • 消费者向rabbitmq broker请求消息相应队列中的消息,可能会设置相应的回调函数以及做一些准备工作
  • 等待rabbitmq broker回应并投递相应队列中的消息,消费者接收消息
  • 消费者确认ack接收到的消息
  • rabbitmq从队列中删除相应已经被确认的消息
  • 关闭信道
  • 关闭连接

RabbitMQ 处理每条AMQP指令都是通过信道完成的,信道是建立在Connection上的虚拟连接,就是生产或者消费者与broker建立的tcp连接。

AMQP协议

RabbitMQ就是AMQP协议的Erlang实现,RabbitMQ是AMQP协议的erlang实现,AMQP的模型架构也是:生产者将消息发送给交换器,交换器和队列绑定,当生产者发送消息时所携带的RoutingKey与绑定时的BindingKey相匹配时,消息被存入相应队列中,消费者可以订阅相应的队列来获取消息。

AMQP协议

  • Module Layer:协议最高层,主要定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑,例如客户端可以使用Queue.Declare命令声明一个队列或者使用Basic.consume订阅消费一个队列中的消息
  • Session Layer:位于中间层,主要负责客户端的命令发送给服务器,再将服务端的应答返回给客户端,主要为客户端与服务器之间的通信提供可靠性同步机制和错误处理
  • Transport Layer:位于最底层,主要传输二进制数据流,提供帧的处理、信道复用、错误检测和数据表示等。

生产者流转过程

  • 客户端与broker建立连接,调用factory.newConnection,broker返回Connection.Start建立连接,
    • 涉及命令;Connection.Start/.Start-OK、Connection.Tune/.Tune-Ok、Connection.Open/.open-Ok
  • 客户准备开启信道,调用connection.createChannel
    • 命令:Channel.Open,Channel.Open-Ok
  • 客户端发送消息,调用channel.basicPublish
    • 命令:Basic.Publish

消费者流转过程

  • 客户端与broker建立连接,调用factory.newConnection,broker返回Connection.Start建立连接,
    • 涉及命令;Connection.Start/.Start-OK、Connection.Tune/.Tune-Ok、Connection.Open/.open-Ok
  • 客户准备开启信道,调用connection.createChannel
    • 命令:Channel.Open,Channel.Open-Ok
  • 消费之前调用channel.basicQos(int prefetchCount)方法设置消费者客户端最大能保持的未确认的消息数
    • 命令:Basic.Qos/.Qos-Ok
  • 真正消费前,消费者客户端需要向broker发送Basic.Consume命令将channel置为接收模式,之后broker回执basic.Consume-Ok告诉准备好了
  • 消费者接收到消息并正确消费后,向broker发送确认
    • 命令:Basic.Ack
  • 消费者停止消费,主动关闭连接
    • Chanel.Close/.Close-Ok和Connection.Close/.Close-Ok

参考:《RabbitMQ实战指南》

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

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

相关文章

15-模型 - 一对多 多对多

一对多: 1. 在多的表里定义外键 db.ForeignKey(主键) 2. 增加字段 db.relationship 建立联系 ("关联表类名","反向引用名") from ext import db# 一 class User(db.Model):id db.Column(db.Integer, primary_keyTrue, autoincrementTrue)us…

LeetCode——回溯篇(一)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 目录 77. 组合 216. 组合总和 III 17. 电话号码的字母组合 39. 组合总和 40. 组合总和 II 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的…

PbootCMS 3.0.4 SQL注入

1.漏洞复现 PbootCMS 3.0.4,下载仓库 星梦/PbootCMS - Gitee.com 复现 漏洞页面:http://127.0.0.1/?search 或 http://127.0.0.1/?keyword POST请求:1select 1 2.正向分析 从可见功能点正向分析 index.php ... // 引用内核启动文件…

深度学习中,batchsize的大小对训练结果有什么影响,如何正确使用

一、影响: Batch size在深度学习训练中起着非常重要的作用,它对训练速度、模型性能、以及模型的泛化能力都有影响。以下是一些主要的影响: 训练速度:较大的batch size可以更充分地利用硬件并行性,从而加快单个epoch的…

4G智慧电力物联网:建设高效智能,引领电力行业革新!

随着4G与物联网技术的快速发展为电力行业提供了更高效、可靠、智能化的解决方案。本文中智联物联将为大家分享智慧电力系统中的一些关键的物联网技术和通讯设备,如工业4G路由器、分布式发电站、数据采集传输、远程监控管理以及变电站监测。 光伏发电站是电力行业中重…

【NI USRP】哪些 USRP 设备支持全双工,哪些支持半双工?

译者 东枫电子科技 设备构成 NI USRPEttus USRPUSRP-2900B200USRP-2901B210USRP-2920N210 WBXUSRP-2921N210 XCVR 2450USRP-2922N210 SBXUSRP-2930N210 WBX GPSDOUSRP-2932N210 SBX GPSDOUSRP-2940RX310 WBX (x2)USRP-2942RX310 SBX (x2)USRP-2943RX310 CBX (x2)U…

万级数据优化EasyExcel+mybatis流式查询导出封装

文章目录 前言.千万级数据优化一. 直接上流式查询封装工具代码二. 传统分页导出查询三. 流式查询概念游标查询 前言.千万级数据优化 我们不妨先给大家讲一个概念,利用此概念我们正好给大家介绍一个数据库优化的小技巧: 需求如下:将一个地市表…

在kaggle中用GPU使用CGAN生成指定mnist手写数字

文章目录 1项目介绍2参考文章3代码的实现过程及对代码的详细解析独热编码定义生成器定义判别器打印我们的引导信息模型训练迭代过程中生成的图片损失函数的变化 4总结5 模型相关的文件 1项目介绍 在GAN的基础上进行有条件的引导生成图片cgan 2参考文章 GAN实战之Pytorch 使用…

Go 自学:切片slices

以下代码展示了两种建立slice的方法。 我们可以使用sort函数给slice排序。 package mainimport ("fmt""sort" )func main() {var fruitList []string{"Apple", "Tomato", "Peach"}fmt.Printf("Type of fruitlist is…

Django基础6——数据模型关系

文章目录 一、基本了解二、一对一关系三、一对多关系3.1 增删改查3.2 案例:应用详情页3.2 案例:新建应用页 四、多对多关系4.1 增删改查4.2 案例:应用详情页4.3 案例:部署应用页 一、基本了解 常见数据模型关系: 一对一…

好用的网页制作工具就是这6个,快点来看!

对于网页设计师来说,好用的网页设计工具是非常重要的,今天本文收集了6个好用的网页设计工具供设计师自由挑选使用。在这6个好用的网页设计工具的帮助下,设计师将获得更高的工作效率和更精致的网页设计效果,接下来,就一…

【Java alibabahutool】JSON、Map、实体对象间的相互转换

首先要知道三者的互转关系&#xff0c;可以先将JSON理解成是String类型。这篇博文主要是记录阿里巴巴的JSONObject的两个方法。toJSONString()以及parseObject()方法。顺便巩固Map与实体对象的转换技巧。 引入依赖 <!-- 阿里巴巴 JSON转换 以下二选一即可 没有去细研究两者…

Centos 7.6 安装mongodb

以下是在CentOS 7.6上安装MongoDB的步骤&#xff1a; 打开终端并以root用户身份登录系统。 创建一个新的MongoDB存储库文件 /etc/yum.repos.d/mongodb-org-4.4.repo 并编辑它。 sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo在编辑器中&#xff0c;添加下面的内容到文件中并…

什么是字体图标(Icon Font)?如何在网页中使用字体图标?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 字体图标&#xff08;Icon Font&#xff09;⭐ 如何在网页中使用字体图标⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

基于MATLAB/Simulink的三相并网逆变器dq阻抗建模及扫频仿真

目录 整体系统介绍理论模型MATLAB实现 基于Simulink的阻抗扫频仿真整体思路注意事项流程框图 其他 本文主要介绍三相并网逆变器dq阻抗建模的相关知识&#xff0c;和大家分享一下怎么使用MATLAB/Simulink来进行理论模型的搭建以及如何通过扫频获取阻抗模型&#xff0c;一方面是给…

Node基础--npm相关内容

下面,我们一起来看看Node中的至关重要的一个知识点-----npm 1.npm概述 npm(Node Package Manager),CommonJS包规范是理论,npm是其中一种实践。 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助npm,Node与第三方模块之间形成了很好的一个 生态系统。(类…

Netty简易聊天室

文章目录 本文目的参考说明环境说明maven依赖日志配置单元测试 功能介绍开发步骤 本文目的 通过一个简易的聊天室案例&#xff0c;讲述Netty的基本使用。同时分享案例代码。项目中用到了log4j2&#xff0c;junit5&#xff0c;同时分享这些基础组件的使用。项目中用到了awt&…

Rust踩雷笔记(5)——刷点链表的题(涉及智能指针Box,持续更新)

目录 leetcode 2 两数相加——模式匹配单链表Box 只能说Rust链表题的画风和C完全不一样&#xff0c;作为新手一时间还不太适应&#xff0c;于是单独为链表、智能指针开一篇&#xff0c;主要记录leetcode相关题型的答案以及注意事项。 leetcode 2 两数相加——模式匹配单链表Bo…

小程序开发之登录授权

小程序开发登录授权流程 看懂这张图登录授权就没问题了&#xff08;哈哈哈哈哈&#xff09; 说明&#xff1a; 调用 wx.login() 获取 临时登录凭证code &#xff0c;并回传到开发者服务器。 调用 auth.code2Session 接口&#xff0c;换取 用户唯一标识 OpenID 和 会话密钥 sess…

【C++】Cmake使用教程(看这一篇就够了)

文章目录 引言一 环境搭建二 简单入门2.1 项目结构2.2 示例源码2.3 运行查看 三 编译多个源文件3.1 在同一个目录下有多个源文件3.1.1 简单版本3.1.1.1 项目结构3.1.1.2 示例代码3.1.1.3 运行查看 3.1.2 进阶版本3.1.2.1 项目结构3.1.2.2 示例源码3.1.2.3 运行查看 3.2 在不同目…