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实战指南》
相关文章:
RabbitMQ笔记-RabbitMQ基本术语
RabbitMQ基本术语 相关概念; 生产者(Producer):投递消息。消息:消息体(payload)标签(label);生产者把消息交给rabbitmq,rabbitmq会根据标签把消息发给感兴趣…...
Git向远程仓库与推送以及拉取远程仓库
理解分布式版本控制系统 1.中央服务器 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统!什么意思呢? 那我们多人…...
PostgreSQL+SSL链路测试
SSL一个各种证书在此就不详细介绍了,PostgreSQL要支持SSL的前提需要打开openssl选项,包括客户端和服务器端。 测试过程。 1. 生成私钥 root用户: mkdir -p /opt/ssl/private mkdir -p /opt/ssl/share/ca-certificateschmod 755 -R /opt/ss…...
服务器(容器)开发指南——code-server
文章目录 code-server简介code-server的安装与使用code-server的安装code-server的启动code-server的简单启动指定配置启动code-server code-server环境变量配置 code-server端口转发自动端口转发手动添加转发端口 nginx反向代理code-servercode-server打包开发版镜像 GitHub官…...
C++贪吃蛇(控制台版)
C自学精简实践教程 目录(必读) 目录 主要考察 需求 输入文件 运行效果 实现思路 枚举类型 enum class 启动代码 输入文件data.txt 的内容 参考答案 学生实现的效果 主要考察 模块划分 文本文件读取 UI与业务分离 控制台交互 数据抽象 需求 用户输入字母表示方…...
Java之字符串实践
功能概述 字符串是Java编程中常用的数据类型,本文对String部分常见功能做了对应实践以及分析。 功能实践 场景1:字符串比较 用例代码 Test public void test_string_compare() {String s1 "abc";String s2 s1;String s5 "abc&quo…...
BM20 数组中的逆序对
描述 解题思路:归并排序 分治:分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进…...
高德猎鹰轨迹查询相关接口
高德猎鹰轨迹官网:服务管理-API文档-开发指南-猎鹰轨迹服务 | 高德地图API 轨迹查询 httpclient的post // post方法请求 创建轨迹 private static void createTrace() {String key "高德注册的key";String sid "服务id"; // 服务idString…...
整理总结新手开始抖音小店经营:常见问题及解决办法
抖音小店作为一种新兴的电商模式,在短时间内获得了广泛的关注和使用。然而,对于新手来说,抖音小店经营可能会遇到一些问题。下面是四川不若与众总结的一些常见的问题以及相应的解决办法。 问题一:产品选择困难 对于新手来说&#…...
4-1-netty
非阻塞io 服务端就一个线程,可以处理无数个连接 收到所有的连接都放到集合channelList里面 selector是有事件集合的 对server来说优先关注连接事件 遍历连接事件...
hive 动态分区-动态分区数量太多也会导致效率下降只设置非严格模式也能执行动态分区
hive 动态分区-动态分区数量太多也会导致效率下降&只设置非严格模式也能执行动态分区 结论 在非严格模式下不开启动态分区的功能的参数(配置如下),同样也能进行动态分区数据写入,目测原因是不严格检查SQL中是否指定分区或者…...
java八股文面试[JVM]——JVM调优
知识来源: 【2023年面试】JVM性能调优实战_哔哩哔哩_bilibili...
FairyGUI-Unity 异形屏适配
本文中会修改到FairyGUI源代码,涉及两个文件Stage和StageCamera,需要对Unity的屏幕类了解。 在网上查找有很多的异形屏适配操作,但对于FairyGUI相关的描述操作很少,这里我贴出一下自己在实际应用中的异形屏UI适配操作。 原理 获…...
Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案
在启动oracle的服务OracleOraDb11g_home1TNSListener时,提示服务启动后又停止了。 解决方法: 修改oracle安装目录下的两个配置文件: 以上两个文件,对应的HOST的值,都改为127.0.0.1 然后再启动服务,启动成…...
Spring复习:(58)<context:annotation-config/>的作用
引入如下的BeanPostProcessor • ConfigurationClassPostProcessor • AutowiredAnnotationBeanPostProcessor • CommonAnnotationBeanPostProcessor • PersistenceAnnotationBeanPostProcessor • EventListenerMethodProcessor如果xml文件配置了bean中使用了Autowired注解…...
“东方杯”英特尔oneAPI黑客松大赛—参赛经验分享
目录 前言1、大赛要求2、oneMKL介绍3、准备 oneMKL基本使用1、下载:2、安装:3、初始化oneMKL环境:4、编译代码5、运行 所需的头文件使用oneMKL工具生成随机数使用fftw3计算FFT调用oneMKL API加速计算FFT对比两种方法的准确性输出结果结束语 前…...
win10家庭版远程桌面补丁_rdp wrapper
RDP Wrapper Library 就是可以帮你在 Windows 7、Windows 8、Windows 10 家庭版中打开远程桌面的工具。 1、把电脑上打开的安全软件与杀毒软件都关掉,因为这个远程桌面补丁会修改系统文件,所以安全软件可能会拦截。 2、下载RDP Wrapper Library补丁压缩…...
【C++设计模式】开放-封闭原则
2023年8月27日,周日下午 我觉得我的这篇博客还是写得很不错的,哈哈哈。 目录 概述举例说明用开放-封闭原则重构 概述 开放-封闭原则(Open-Closed Principle,OCP)是面向对象设计中的一个重要原则,也是许多…...
vue+file-saver+xlsx+htmlToPdf+jspdf实现本地导出PDF和Excel
页面效果如下(echarts图表按需添加,以下代码中没有) 1、安装插件 npm install xlsx --save npm install file-saver --save npm install html2canvas --save npm install jspdf --save2、main.js引入html2canvas import htmlToPdf from …...
axios 进阶
axios 进阶 接口传参方式 使用 xhr 原生技术或者是 axios 时,它的 post 传参方式是键值对的形式 keyvalue。但是在实际开发中一般是使用对象的形式定义数据,方便读取和赋值。所以当我们需要发起请求时可以通过 qs 这一款插件将对象转成键值对形式&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
