首页 > 代码库 > RabbitMQ源码分析 1. 启动过程

RabbitMQ源码分析 1. 启动过程

RabbitMQ的启动是基于boot steps, boot steps的每一个step可能是启动一个component,也可能是打印一个启动信息。 boot steps是一个有向无环图,保证了启动的顺序性。

一个boot step:

-rabbit_boot_step({recovery,
[{description, "exchange, queue and binding recovery"},
{mfa,         {rabbit, recover, []}},
{requires,    empty_db_check},
{enables,     routing_ready}]}).

name是recovery,

mfa是启动Module,Function,Arguments, 

requires是必须在其之前启动的boot step

enables是在其之后可以启动的boot step


来看下整个的启动过程:

RabbitMQ只有一个Application, 由rabbit_app.in 可知, rabbit的启动入口是rabbit.erl的  start/0,

start/0, 主要做了几件事:

      1.  从rabbit_app.in里load rabbit这个application, 存到ac_tab这个ets table里

      2.  setup log往哪里打,tty or file

      3.  确定mnesia存储目录

      4. 读写nodes_running_at_shutdown和cluster_nodes.config 两个文件

      5. check所有node网络连通,所有的node otp 版本是否相同,所有的node rabbitMq 版本是否兼容

      6. load os_mon, mnesia 这两个application

      7. 按依赖顺序启动os_mon, mnesia, rabbit


 rabbit真正启动的入口是start/2,主要做了以下几件事:

      1. check erlang的版本

      2. 启动rabbit_sup,并没有启动任何child

      3. 注册rabbit这个进程

      4. 构造boot steps有向无环图,并按顺序启动boot steps

       

      这里是一张完整的有向无环图:

  下面来逐个对boot step进行剖析。

RabbitMQ源码分析 1. 启动过程