RabbitMQ是一个消息队列的实现,基于AMQP(Advanced Message
Queuing Protocol)。最近因为工作需要,打算深入了解RabbitMQ的架构以实现,后续会出一系列文章记录分析过程。这篇总结RabbitMQ的启动过程。
(注:分析代码基于RabbitMQ 2.8.2)
RabbitMQ的启动入口在[$RABBIT_SRC/src/rabbit.erl
--> start/2]。主要代码如下:
start(normal, []) ->
case erts_version_check() of
ok ->
{ok, SupPid} = rabbit_sup:start_link(),
true = register(rabbit, self()),
[ok = run_boot_step(Step) || Step <- boot_steps()],
io:format("~nbroker running~n"),
{ok, SupPid};
Error ->
Error
end.
其中rabbit_sup:start_link/0启动rabbit的监控树。最重要是这个调用[ok
= run_boot_step(Step) || Step <- boot_steps()]。
boot_steps会从已加载的模块中提取自定义属性rabbit_boot_step的值(大部分定义在[$RABBIT_SRC/src/rabbit.erl]文件中),该结构定义了rabbit在启动过程中的一个启动步骤,其中包含:启动该步骤的启动入口,该步骤所依赖的步骤以及依赖于该步骤的步骤。其结构如下:
-rabbit_boot_step({rabbit_registry,
[{description, "plugin registry"},
{mfa, {rabbit_sup, start_child,
[rabbit_registry]}},
{requires, external_infrastructure},
{enables, kernel_ready}]}).
其中rabbit_registry定义步骤名称,mfa定义启动入口,requires定义该步骤所依赖的步骤(组名),enables说明依赖于该步骤成功执行的步骤。
启动步骤可以分组。一组步骤的启动会依赖于另一组步骤的成功执行。像上面的rabbit_registry就依赖于external_infrastructure(包含多个启动步骤)的成功执行,而rabbit_registry的成功启动则会使kernel_ready进入准备状态。实际上,会有多个启动步骤会使kernel_ready进入准备状态,只有所有这些启动步骤都成功启动后,依赖于kernel_ready的步骤才能启动(像rabbit_log, rabbit_event都会使kernel_ready进入准备状态)。
RabbitMQ就根据这些启动步骤之间的依赖关系,构造一个有向无环图(这跟我在ganger里对进程依赖关系的组织类似),并拓扑排序所有步骤(参见[$RABBIT_SRC/src/rabbit.erl --> sort_boot_steps/2]),生成唯一的启动顺序,然后按照该启动顺序调用相应启动步骤的MFA启动相应功能(参见[$RABBIT_SRC/src/rabbit.erl --> run_boot_steps/2])。
(具体有哪些启动步骤,以及每个步骤的具体功能参见这篇文章:RabbitMQ
Boot Process)
分享到:
相关推荐
3.11.2"很可能是RabbitMQ服务器的安装包或者源码包,包含了运行RabbitMQ服务器所需的所有组件,如erlang环境(由于RabbitMQ是用Erlang语言编写的),配置文件,启动脚本等。 结合以上信息,我们可以探讨以下几个...
Java RabbitMQ 源码分析 RabbitMQ是一款开源的消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统、微服务架构中,用于解耦生产者和消费者,实现异步处理和负载均衡。...
安装完成后,通过启动RabbitMQ Server服务,可以开始使用它的功能。 RabbitMQ Server提供了以下主要功能: - **消息队列**:消息被发送到队列,消费者可以从队列中获取并处理消息。这种模式可以确保即使在消费者不...
集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...
集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...
集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...
集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...
集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...
java8集合源码分析《Java业务开发常见错误100例》源码目录专栏地址点赞趋势如果觉得源码对你有帮助,欢迎Star源码说明专栏的所有代码基于Java8+SpringBoot2.2.1.RELEASE+SpringCloudGreenwich.SR4+SpringDataMoore-...
集合源码分析 《Java业务开发常见错误100例》源码目录 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + Spring Data Moore-SR4开发,基于Maven做依赖管理。 每一个...
这是一个基于SpringBoot、Redis、RabbitMQ和MySQL技术栈实现的商城秒杀系统源码项目。下面将详细解析其中涉及的技术点。...通过深入研究和分析源码,可以更好地理解这些技术如何协同工作,解决实际问题。
### nova-compute源码分析 #### 一、Nova概述及工作职责 **1.1 Nova的角色与任务** Nova是OpenStack项目中一个至关重要的组成部分,它主要负责虚拟机实例的生命周期管理,包括创建、调度、运行和销毁等功能。具体...
6. **源码分析**:在解压后的`src`目录中,通常包含Java源文件、配置文件和测试用例。源码会展示如何在SpringBoot启动类、配置类以及业务逻辑类中实现延时队列的完整流程。通过阅读源码,你可以深入理解如何在实际...
在源码分析过程中,你需要注意RabbitMQ的API使用,例如`Channel`对象的使用、`BasicPublish`和`BasicConsume`方法,以及如何正确处理异常和关闭资源。同时,理解AMQP协议的五部分模型(连接、通道、交换机、队列和...
- **安装RabbitMQ**:在Erlang环境就绪后,解压RabbitMQ源码,按照官方文档进行编译和安装。 - **启动服务**:安装完成后,启动RabbitMQ服务器,并检查是否正常运行。 4. **RabbitMQ依赖包** - **依赖管理**:...
在RabbitMQ部分,我们详细介绍了RabbitMQ的架构、环境准备和集成高级特性,如消息的可靠性保障、死信队列、延迟队列等,并对RabbitMQ的集群、运维源码分析,解析RabbitMQ的启动过程、交换器的实现、队列的实现等。...
在阅读这本书时,通过分析和运行这些源码,读者可以更好地理解Spring Cloud组件的工作原理,以及如何将它们集成到实际项目中。源码包中的cloud-book-master目录结构通常会按照章节划分,每个章节可能对应一个或多...
8. **监控与日志**:学习如何利用SpringBoot的Actuator实现系统监控,以及如何设置日志系统,以便于问题排查和性能分析。 通过这个项目,开发者可以全面地掌握分布式系统的架构设计、服务治理、消息队列的使用以及...
三、源码分析 1. 主控程序:启动库存管理系统,初始化数据库连接,加载配置信息,为其他模块提供服务。 2. 商品管理模块:负责商品信息的增删改查,包括商品编码、名称、规格、单位、供应商等。 3. 库存操作模块:...
源码分析可以帮助你理解配置的加载和刷新机制,以及Git仓库或本地文件系统的配置存储方式。 5. **Spring Cloud Bus**:用于广播配置更改,确保集群中所有实例都能接收到最新的配置信息。通过RabbitMQ或Kafka等消息...