又回到 erlang 了,使用了一段时间的 golang 再回到 erlang 有点那么的亲切感。在项目中也准备用 mqtt 来做消息上报,顺道就想看下他的代码。
erlang 中 application 都是通过 supervisor 来管理的,在 emq 中 emqttd_sup 是一个最大的 supervisor,他下面面又连接了很多的 supervisor 或者 worker。
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 会给你自动重启。