搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
你好赵伟
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
idea中设置记住Git账号密码《新版》_idea记住git密码
2
【错误记录】Android Studio 配置 AspectJ 报错 ( Failed to create Jar file C:\xxx\aspectjtools-1.8.10.jar. )
3
基于STM32四轴飞行器电路方案设计_飞行控制系统的定时器
4
Windows下运行kafka_kafka windows
5
大数据快速搭建环境 CDH QuickStart VM虚拟机版本安装_cloudera quickstart
6
git 创建删除远程分支_git push 时删除创建远程分支
7
三步,本机白嫖 Stable Diffusion 3 模型!附操作手册_stable diffusion v3.0
8
torch创建2d卷积层报错
9
AIGC入门基础教程:详尽指南,从入门到精通一文搞定_aigc学习
10
安装pyspark过程,超级easy_pyspark 安装
当前位置:
article
> 正文
RabbitMQ源码分析 – 实体初始化
作者:你好赵伟 | 2024-06-14 06:37:55
赞
踩
初始化rabbitmqtemplate的实体类
(注:分析代码基于RabbitMQ 2.8.2)
Connection
在上篇文章中提到,客户端连上rabbit后,需要向rabbit发送AMQP协议头,rabbit在收到协议头后,开始在0号channel 上跟客户端进行交互(AMQP中一个连接可以多路复用,1~65535为可用的channel编号,0号channel,也就是frame中channel的索引为0,被认为是全局于整个连接)。
根据AMQP协议,经过
connection.start
-> connection.start_ok ->
connection.secure
-> connection.secure_ok ->
connection.tune
-> connection.tune_ok(这时rabbit会建立一个心跳进程)-> connection.open ->
connection.open_ok
后,客户端与rabbit之间就认为已经建立了连接(相关代码参见[$RABBIT_SRC/src/rabbit_reader.erl --> handle_method0/2])。
(粗体指令由rabbit服务器发出)
Channel
当客户端发来的frame中,channel的索引不为0时,rabbit认为这些数据从属于某个channel。如果该channel进程不存在,则会创建一个channel进程(rabbit_channel,具体参见[$RABBIT_SRC/src/rabbit_reader.erl --> create_channel/2),并由此进程负责该channel上的所有数据([$RABBIT_SRC/src/rabbit_reader.erl --> process_channel_frame/3)。
根据AMQP协议,经过channel.open ->
channel.open_ok
([$RABBIT_SRC/src/rabbit_channel.erl --> handle_method/3)后,客户端就可以开始在该channel上发送数据了。
Exchange
当rabbit收到来自客户端的exchange.declare指令时,rabbit会根据客户端的参数创建一个exchange。首先rabbit会向mnesia的表rabbit_exchange写入一条记录,包含客户端请求的exchange类型信息(默认4种类型:direct,topic,fanout,head)及相关参数,如果exchange是需要持久化的(durable),则还需要向rabbit_durable_exchange表中写入相同信息。然后,rabbit会通过rabbit_event发送exchange_created的事件(统计作用)。
Queue
queue在创建时,需要确定要创建queue的类型(rabbit里称为backing_queue):一般情况下,queue只在当前结点(客户端所连接的结点)创建,对应backing_queue为rabbit_variable_queue;当有
HA
策略时,queue需要在集群中的多个结点上创建(这时候,有master结点和slave结点之分,master结点未必是当前结点),master结点创建队列对应backing_queue为rabbit_mirror_queue_master,slave结点对应backing_queue为rabbit_mirror_queue_slave(master,slave实际最终也会创建一个rabbit_variable_queue)。
创建一个队列首先会创建一个rabbit_amqqueue_process进程。然后同exchange类似,都需要先在mnesia表里写入queue的基本信息(rabbit_queue,rabbit_durable_queue)。然后初始化对应的backing_queue,最后发送queue_create事件。
我们来看一下backing_queue为rabbit_variable_queue时,初始化需要做什么:1)初始化queue的索引(rabbit_queue_index:init/2)或者从以前的队列恢复索引(rabbit_queue_index:recover/5,durable队列);2)创建message store或者恢复message store(rabbit_msg_store:client_init/4,恢复仅对于durable队列)。
rabbit_mirror_queue_master初始化:1)创建一个rabbit_mirror_queue_coordinator及相应GM(Guaranteed Multicast);2)获取该队列相关的镜像节点,并调用rabbit_mirror_queue_misc:add_mirror/2启动镜像队列进程;3)在当前结点(或者master结点)初始化一个rabbit_variable_queue队列;4)通过GM向所有镜像广播3中初始化队列的长度。
rabbit_mirror_queue_misc:add_mirror/2启动镜像队列进程时,启动的是一个rabbit_mirror_queue_slave进程,相比rabbit_variable_queue,它只是多了个初始化GM的工作。最后也会初始化一个rabbit_variable_queue队列。
Binding
用于将queue绑定到一个exchange。主要涉及到几个数据表写入(见下表,true或者false代表相应对象是不是durable),无其它复杂逻辑,写入完成后会发送binding_created事件。
exchage queue table
true true rabbit_durable_route
rabbit_semi_durable_route
rabbit_route
rabbit_reverse_route
false true rabbit_semi_durable_route
rabbit_route
rabbit_reverse_route
true/false false rabbit_route
rabbit_reverse_route
topic类型的exchange还需要将binding信息写入以下数据表:rabbit_topic_trie_edge,rabbit_topic_trie_binding,rabbit_topic_trie_node(基于
trie
数据结构,用于route key的匹配)。
(本文只是个流程上的梳理,文中的一些概念及作用后续会再详细分析)
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/你好赵伟/article/detail/716849
推荐阅读
article
RabbitMQ
-
消费者
确认
机制
_
rabbitmq
消费者
确认
机制
...
消息失败之后会重新入队,然后再次异常,再次入队,无限循环,这会导致mq消息处理飙升,带来不必要的压力。为了缓解这种压力,...
赞
踩
article
麒麟
离线 没有网络
安装
RabbitMQ
_
麒麟
rabbitmq
离线
安装
...
如何给离线
麒麟
操作系统
安装
RabbitMQ
。_
麒麟
rabbitmq
离线
安装
麒麟
rabbitmq
离线
安装
...
赞
踩
article
RabbitMQ
(
安装
配置
以及与
SpringBoot
整合)_
rabbitmq
springboot
配...
5.再次登录,成功!2.MQ的端口
配置
1.编辑MQ的
配置
文件2.修改端口5672为6783(防止被攻击)3.重启MQ使其...
赞
踩
article
RabbitMQ
简单
使用
方法
,
以异步
处理
日志
为例:_
使用
rabbitmq
优化
日志
操作
并
代替直接调...
通过上述步骤
,
您可以实现PHP中
使用
RabbitMQ
进行异步
日志
记录
,
并
确保消费者可以持续运行
,
无缝
处理
日志
消息。将消费...
赞
踩
article
RabbitMQ
docker
安装及使用...
* 复制配置文件到宿主机**
RabbitMQ
docker
安装及使用 ...
赞
踩
article
RabbitMQ
--基础--
02
--原理_
rabbitmq
unsynchronised
...
当一个新slave加入到一个镜像队列时,这时这个新slave是空的,而master中这时可能包含之前接收到的消息。因为要...
赞
踩
article
【
RabbitMQ
】
RabbitMQ
配置
与
交换机
学习
...
RabbitMQ
是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)。
RabbitMQ
支持多种消息传递协议,具...
赞
踩
article
rabbitmq
集群
保证
顺序
消费_
RabbitMQ
集群
的高可用...
前言:在讲
集群
高可用之前,先讲两个问题:一,
RabbitMQ
消息可靠性传输1,队列持久化2,消费端的手动Basic.Ac...
赞
踩
article
RabbitMQ
(十)
顺序
消费
_
rabbitmq
顺序
消费
...
一,前言对于一些业务来说,需要确保消息被
消费
时候的
顺序
性。例如,有前后关系的查询-新增-删除这么三个消息,
消费
者必须按照...
赞
踩
article
r
a
bbitMq 报错 o.s.
a
.
r
.c.C
a
chingConnectionF
a
cto
r
y: Ch...
r
a
bbimq o.s.
a
.
r
.c.C
a
chingConnectionF
a
cto
r
y: Ch
a
nnel shutdown...
赞
踩
article
RabbitMQ
-工作
模式
(
Publish
模式
&
Routing
模式
)...
最重要的变化是 我们现在希望将消息发布到我们的交易所,而不是 无名的。交换机是一个非常简单的东西。第一个队列绑定了绑定键...
赞
踩
article
rabbitMQ
基于注解 快速配置
交换机
消息队列_
@
rabbitlistener
(
bindings
...
可以在类名上添加 名字自己修改下即可。_
@
rabbitlistener
(
bindings
=
@
queuebinding
...
赞
踩
article
RabbitMQ
路由
模式即直接
交换机
_
rabbitmq
路由
键和
交换机
...
1.
路由
交换机
这种类型的工作方式是,消息只去到它绑定的routing key的队列中去2.实战(1)图示(2)代码实现p...
赞
踩
article
RabbitMQ
死信队列&
延迟
交换机
_
延迟
交换机
rabbitmq
...
RabbitMQ
死信队列&
延迟
交换机
_
延迟
交换机
rabbitmq
延迟
交换机
rabbitmq
...
赞
踩
article
RabbitMQ
--
基础
--
03
--
交换机
的类型_
rabbitmq
routekey
模糊
匹配
...
rabbitmq
_
rabbitmq
routekey
模糊
匹配
rabbitmq
routekey
模糊
匹配
...
赞
踩
article
RabbitMQ
中有
哪几种
交换机
类型?_
rabbitmq
交换机
种类...
这种
交换机
根据消息的标头信息(Headers)来决定消息的路由,而不是使用路由键。队列和
交换机
之间的绑定规则是根据标头键...
赞
踩
article
RabbitMQ
交换机
详解_
tpoic
交换机
rabbitmq
,2024年最新oppo大
数据
开发面...
主题
交换机
(Topic Exchange)是一种消息队列的
交换机
类型,它通过对消息的路由键和队列到
交换机
的绑定模式之间的...
赞
踩
article
RabbitMQ
| 环境部署|
交换机
类型
|
消费
幂等性_
rabbitmq
如何
选择
交换机
类型
...
3.发布订阅模式3.1
交换机
类型
Fanout:广播,将消息交给所有绑定到
交换机
的队列Direct:定向,把消息交给符合...
赞
踩
article
RabbitMQ
消息
确认
机制、补偿机制、
消息
幂等性实践_
acknowledge
-
mode
默认值...
1. 场景先看这么几个面试题:如何保证
消息
的可靠性投递?即如何确定
消息
是否发送成功?如果失败如何处理(补偿机制)?如何保...
赞
踩
article
RabbitMQ
(1)_
优先级
队列
mq
...
RabbitMQ
知识点_
优先级
队列
mq
优先级
队列
mq
Rabbi...
赞
踩
相关标签
rabbitmq
分布式
网络
kylin
arm
linux
java-rabbitmq
spring boot
php
docker
容器
学习
ruby
java
spring cloud
spring
rabbitmq 集群保证顺序消费
数据库