1. 程式人生 > >Erlang:RabbitMQ原始碼分析 1. 啟動過程

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