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进行剖析。