RabbitMQ DAG启动图解

简介: RabbitMQ对待启动这件事是很认真的,通过把启动步骤描述成DAG,然后拓扑排序依次启动。

RabbitMQ 启动(bootsteps)

RabbitMQ对待启动这件事是很认真的,通过把启动步骤描述成DAG,然后拓扑排序依次启动。

之所以‘小题大做’,因为RabbitMQ的模块非常多,模块之间的依赖关系强。

bootsteps之DAG节点

requires描述前驱节点。

enables描述后继节点。

-rabbit_boot_step({codec_correctness_check,
                   [{description, "codec correctness check"},
                    {mfa,         {rabbit_binary_generator,
                                   check_empty_frame_size,
                                   []}},
                    {requires,    pre_boot},
                    {enables,     external_infrastructure}]}).

上图:

ac3998e20f7a37e8a5dbc5fd030bdf768e6238a1.png

dot代码

dot命令

dot -Tpng "rabbit_boot.gv" > "/home/max/Code/rabbit_boot.png"

把-rabbit_boot_step属性全部拷贝到rabbit_attribute.erl文件,然后一条erlang命令搞定

lists:foreach(fun({A, B}) -> io:format("~s \-> ~s;~n", [A, B]) end ,[{KK, proplists:get_value(enables, V)} || {K, [{KK, V}]} <- rabbit_attribute:module_info(attributes), K =:= rabbit_boot_step, proplists:get_value(enables, V) =/= undefined]).

dot代码

digraph G
{
    pre_boot [shape=doublecircle, style=filled,color=black,fillcolor=green;
    pre_boot -> codec_correctness_check;
    file_handle_cache -> database;
    database -> database_sync;
    pre_boot -> file_handle_cache;
    pre_boot -> worker_pool;
    external_infrastructure -> rabbit_registry;
    external_infrastructure -> rabbit_event;
    external_infrastructure -> kernel_ready;
    kernel_ready -> rabbit_alarm;
    rabbit_alarm -> rabbit_memory_monitor;
    kernel_ready -> guid_generator;
    kernel_ready -> delegate_sup;
    rabbit_alarm -> rabbit_node_monitor;
    guid_generator -> rabbit_node_monitor;
    kernel_ready -> core_initialized;
    core_initialized -> recovery;
    recovery -> mirrored_queues;
    core_initialized -> routing_ready;
    routing_ready -> log_relay;
    log_relay -> direct_client;
    log_relay -> networking;
    networking -> notify_cluster;
    background_gc;
    edge [style="dashed", color="blue"];
    codec_correctness_check -> external_infrastructure;
    database -> external_infrastructure;
    database_sync -> external_infrastructure;
    file_handle_cache -> worker_pool;
    worker_pool -> external_infrastructure;
    rabbit_registry -> kernel_ready;
    rabbit_event -> kernel_ready;
    rabbit_alarm -> core_initialized;
    rabbit_memory_monitor -> core_initialized;
    guid_generator -> core_initialized;
    delegate_sup -> core_initialized;
    rabbit_node_monitor -> core_initialized;
    empty_db_check -> routing_ready;
    recovery -> routing_ready;
    mirrored_queues -> routing_ready;
    log_relay -> networking;
    background_gc -> networking;
}
相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 存储 监控
【图解RabbitMQ-3】消息队列RabbitMQ介绍及核心流程
【图解RabbitMQ-3】消息队列RabbitMQ介绍及核心流程
745 0
|
JSON 数据处理 Go
一文教会你如何使用 iLogtail SPL 处理日志
iLogtail 作为日志、时序数据采集器,在 2.0 版本中,全面支持了 SPL 。本文对处理插件进行了梳理,介绍了如何编写 SPL 语句,从插件处理模式迁移到 2.0 版本的 SPL 处理模式,帮助用户实现更加灵活的端上数据处理。
817 117
|
9月前
|
消息中间件
消息的重复消费问题如何解决
在使用RabbitMQ进行消息收发的时候, 如果发送失败或者消费失败会自动进行重试, 那么就有可能会导致消息的重复消费 , 具体的解决方案其实非常简单, 为每条消息设置一个唯一的标识id , 将已经消费的消息记录保存起来 , 后期再进行消费的时候判断是否已经消费过即可 , 如果已经消费过则不消费 , 如果没有消费过则正常消费
|
9月前
|
消息中间件 人工智能 自然语言处理
基于 RocketMQ 事件驱动架构的 AI 应用实践
基于 RocketMQ 事件驱动架构的 AI 应用实践
303 2
|
9月前
|
消息中间件
RabbitMQ 的工作模型有哪些
RabbitMQ 的工作模型有哪些
|
测试技术
个推消息推送专项运营提升方案,基于AIGC实现推送文案智能生成
个推消息推送专项运营提升方案自今年3月份发布以来,已应用于游戏社交、影音资讯、电商购物等多个行业。现个推消息推送专项运营提升方案又实现了推送策略的智能化和推送流程的自动化,助力APP进一步提升消息推送的效率和效果。
452 0
个推消息推送专项运营提升方案,基于AIGC实现推送文案智能生成
|
运维 关系型数据库 MySQL
"MySQL运维精髓:深入解析数据库及表的高效创建、管理、优化与备份恢复策略"
【8月更文挑战第9天】MySQL是最流行的开源数据库之一,其运维对数据安全与性能至关重要。本文通过最佳实践介绍数据库及表的创建、管理与优化,包括示例代码。涵盖创建/删除数据库、表结构定义/调整、索引优化和查询分析,以及数据备份与恢复等关键操作,助您高效管理MySQL,确保数据完整性和系统稳定运行。
886 0
|
存储 弹性计算 运维
如何正确选择多云架构?
多云是指企业使用两个或更多的公有云 IaaS 供应商。广义来看,混合云也在其范畴。
1082 1
如何正确选择多云架构?
|
存储 机器学习/深度学习 算法
10个大型语言模型(LLM)常见面试问题和答案解析
今天我们来总结以下大型语言模型面试中常问的问题
776 0
|
运维 监控 网络架构
云服务的稳定性
【4月更文挑战第29天】云服务的稳定性
530 2