`
jzhihui
  • 浏览: 268132 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

RabbitMQ源码分析 - 启动

阅读更多

RabbitMQ是一个消息队列的实现,基于AMQPAdvanced 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

2
0
分享到:
评论

相关推荐

    otp-win64-25.1.2 rabbitmq-server-3.11.2

    3.11.2"很可能是RabbitMQ服务器的安装包或者源码包,包含了运行RabbitMQ服务器所需的所有组件,如erlang环境(由于RabbitMQ是用Erlang语言编写的),配置文件,启动脚本等。 结合以上信息,我们可以探讨以下几个...

    Java rabbitMQ源码

    Java RabbitMQ 源码分析 RabbitMQ是一款开源的消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统、微服务架构中,用于解耦生产者和消费者,实现异步处理和负载均衡。...

    rabbitmq-server

    安装完成后,通过启动RabbitMQ Server服务,可以开始使用它的功能。 RabbitMQ Server提供了以下主要功能: - **消息队列**:消息被发送到队列,消费者可以从队列中获取并处理消息。这种模式可以确保即使在消费者不...

    java8集合源码分析-code-study:代码学习

    集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...

    java8集合源码分析-java-mistakes:java-错误

    集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...

    java8集合源码分析-common-mistakes:常见错误

    集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...

    java8集合源码分析-java-mistake:java错误

    集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...

    java8集合源码分析-common-business-mistakes:常见的商业错误

    集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...

    java8集合源码分析-java-common-mistakes:《Java业务开发常见错误100例》

    java8集合源码分析《Java业务开发常见错误100例》源码目录专栏地址点赞趋势如果觉得源码对你有帮助,欢迎Star源码说明专栏的所有代码基于Java8+SpringBoot2.2.1.RELEASE+SpringCloudGreenwich.SR4+SpringDataMoore-...

    java8集合源码分析-geek-java-common-mistakes:极客时间-Java业务开发常见错误100例

    集合源码分析 《Java业务开发常见错误100例》源码目录 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + Spring Data Moore-SR4开发,基于Maven做依赖管理。 每一个...

    基于SpringBoot、Redis、RabbitMQ、MySQL的商城秒杀项目源码.zip

    这是一个基于SpringBoot、Redis、RabbitMQ和MySQL技术栈实现的商城秒杀系统源码项目。下面将详细解析其中涉及的技术点。...通过深入研究和分析源码,可以更好地理解这些技术如何协同工作,解决实际问题。

    nova-compute源码分析

    ### nova-compute源码分析 #### 一、Nova概述及工作职责 **1.1 Nova的角色与任务** Nova是OpenStack项目中一个至关重要的组成部分,它主要负责虚拟机实例的生命周期管理,包括创建、调度、运行和销毁等功能。具体...

    rabbitmq_delayed.zip

    6. **源码分析**:在解压后的`src`目录中,通常包含Java源文件、配置文件和测试用例。源码会展示如何在SpringBoot启动类、配置类以及业务逻辑类中实现延时队列的完整流程。通过阅读源码,你可以深入理解如何在实际...

    rabbitMq入门

    在源码分析过程中,你需要注意RabbitMQ的API使用,例如`Channel`对象的使用、`BasicPublish`和`BasicConsume`方法,以及如何正确处理异常和关闭资源。同时,理解AMQP协议的五部分模型(连接、通道、交换机、队列和...

    rabbitmq软件包

    - **安装RabbitMQ**:在Erlang环境就绪后,解压RabbitMQ源码,按照官方文档进行编译和安装。 - **启动服务**:安装完成后,启动RabbitMQ服务器,并检查是否正常运行。 4. **RabbitMQ依赖包** - **依赖管理**:...

    RabbitMQ开发演示文档

    在RabbitMQ部分,我们详细介绍了RabbitMQ的架构、环境准备和集成高级特性,如消息的可靠性保障、死信队列、延迟队列等,并对RabbitMQ的集群、运维源码分析,解析RabbitMQ的启动过程、交换器的实现、队列的实现等。...

    《Spring Cloud 微服务架构进阶》各章节附录源码-cloud-book.zip

    在阅读这本书时,通过分析和运行这些源码,读者可以更好地理解Spring Cloud组件的工作原理,以及如何将它们集成到实际项目中。源码包中的cloud-book-master目录结构通常会按照章节划分,每个章节可能对应一个或多...

    SpringBoot+Zookeeper+Dubbo+rabbitMQ实现分布式高并发秒杀系统.zip

    8. **监控与日志**:学习如何利用SpringBoot的Actuator实现系统监控,以及如何设置日志系统,以便于问题排查和性能分析。 通过这个项目,开发者可以全面地掌握分布式系统的架构设计、服务治理、消息队列的使用以及...

    计算机软件-编程源码-库存管理.zip

    三、源码分析 1. 主控程序:启动库存管理系统,初始化数据库连接,加载配置信息,为其他模块提供服务。 2. 商品管理模块:负责商品信息的增删改查,包括商品编码、名称、规格、单位、供应商等。 3. 库存操作模块:...

    springcloud学习源码-yuanma.zip

    源码分析可以帮助你理解配置的加载和刷新机制,以及Git仓库或本地文件系统的配置存储方式。 5. **Spring Cloud Bus**:用于广播配置更改,确保集群中所有实例都能接收到最新的配置信息。通过RabbitMQ或Kafka等消息...

Global site tag (gtag.js) - Google Analytics