又回到erlang了,使用了一段時間的golang再回到erlang有點那麼的親切感。在項目中也準備用mqtt來作消息上報,順道就想看下他的代碼。html
erlang中application都是經過supervisor來管理的,在emq中emqttd_sup是一個最大的supervisor,他下面面又鏈接了不少的supervisor或者worker。node
ekka:start() emqttd_sup |-------->emqttd_ctl 負責從emqttd_ctl命令過來的rpc handler |-------->emqttd_hooks(hook 函數的處理) |-------->emqttd_router(各node之間的消息路由) |-------->emqttd_pubsub_sup(管理pubsub相關的supervisor) |-------->emqttd_pool_sup(emqttd_pubsub的supervisor)gproc_pool |----->emqttd_pubsub_1(worker) |----->emqttd_pubsub_2(worker) |-------->emqttd_pool_sup(emqttd_server的supervisor)gproc_pool |----->emqttd_server_1(worker) |----->emqttd_server_2(worker) |--------->emqttd_stats(stats topic相關的統計) |--------->emqttd_stats(metrics topic相關的統計) |--------->emqttd_pool_sup(pooler沒看到哪裏用到了這快)gproc_pool |------->pooler_1(worker) |------->pooler_2(worker) |--------->emqttd_sm_sup( session management supervisor)gproc_pool |------->emqttd_sm_1(worker) |------->emqttd_sm_2(worker) |--------->emqttd_ws_client_sup(websocket client supervisor)gproc_pool |------->emqttd_ws_client_1(worker) |------->emqttd_ws_client_2(worker) |--------->emqttd_broker(broker統計相關handler) |--------->emqttd_alarm(系統alerm相關的handler) |--------->emqttd_mod_sup(管理外部mod的supervisor) |--------->emqttd_bridge_sup_sup(bridge supervisor) |--------->emqttd_access_control(auth/acl相關管理模塊) |--------->emqttd_sysmon_sup(system monitor supervisor) |-------->emqttd_sysmon(vm system monitor) register_acl_mod() start_listener()
以後就開始socket監聽了,等待新的鏈接到來。
erlang的優點在於他又一套完善的process 監控系統。具體能夠參考這裏, 子進程退出後supervisor會給你自動重啓。golang