Erlang: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進行剖析。