简述:
EMQX也是使用Erlang语言实现的一个MQTT broker,为了学习并对比一下和自己实现的区别,取长补短,也为了给一些希望学习EMQX源码的童鞋一个大纲性质的引导,我边学习边写下了这三篇文章。
=============================================================
首先都是从目录结构开始了:
- EMQX
- etc :看起来像是一些配置文件,后续分析
- certs:放证书的
- include:头文件
- priv:不清楚是啥
- scripts:启动脚本?
- src:源代码
- test:测试代码
仅仅列出了文件夹,子文件未列。
按照启动顺序,走一遍程序:
- 通过Makefile调用run_emqx.escript
run_emqx.escript:
a. 加载mnesia库
b. 拼接mnesia本地目录路径并设置
c. 调用emqx_ct_helpers:start_app/4,参数为app名称,emqx.schema文件路径,emqx.conf文件路径,空的匿名函数
emqx_ct_helpers.erl:
发现没有这个文件,查看rebar.config,是引用的其他库
该文件是用于测试流程启动应用的,流程如下:
a. 定义data,etc,log,plugins文件夹
b. 读取配置文件,并拼接上一步的文件路径配置,生成新的配置文件xxx.rendered
c. 读取emqx.schema文件配置,并与config.rendered一起加载到app的环境变量里
d. 回调匿名函数(start变量传入的)
e. 启动app应用,并确保所有关联应用均启动
emqx_app.erl:
a. 启动应用ekka:看起来是一个集群管理和监控的工具,后面再看。
b. 启动主监控树
- emqx_kernal_sup:
1)emqx_pool_sup: 进程池管理器
2)emqx_hooks: 回调管理器
3)emqx_stats: 计数器
4)emqx_metrixs: 返回码或者状态判定
5)emqx_ctl: 命令行命令管理
6)emqx_zone: 定义不同的监听器(Listener)域 - emqx_router_sup: 对Topic的路由
1)router pool
2)router helper - emqx_broker_sup: 功能处理逻辑:订阅,取消订阅,发布
1)broker pool
2)share subscribe (MQTT5.0新特性,暂不管)
3)broker helper - emqx_cm_sup: channel manager
1)emqx_banned: 黑名单?
2)emqx_flapping:Flapping检测?
3)emqx_cm_locker: 客户端session锁
4)emqx_cm_registry:开启或关闭Channel
5)emqx_cm:channel manager主要人口 - emqx_sys_sup: 主要是一些监控进程
1)emqx_sys
2)emqx_sys_mon
3)emqx_os_mon
4)emqx_vm_mon
c. 模块加载
d. 插件初始化和加载
e. 确认成功启动listener
- 启动MQTT/TCP: esockd模块
- 启动MQTT/SSL: esockd模块
- 启动MQTT/WS: cowboy模块
- 启动MQTT/WSS:cowboy模块
esockd模块,后续再解释,启动时会将emqx_connection回调传过去
cowboy模块,回调为emqx_ws_connection
f. 启动ekka,auto_cluster
g. 加载emqx_alarm 告警模块
到此,整个服务启动完成,下一篇会继续探索emqx客户端连接行为。