美文网首页
EMQX源码阅读(一)

EMQX源码阅读(一)

作者: andywangzhen | 来源:发表于2020-01-13 12:27 被阅读0次

简述:
EMQX也是使用Erlang语言实现的一个MQTT broker,为了学习并对比一下和自己实现的区别,取长补短,也为了给一些希望学习EMQX源码的童鞋一个大纲性质的引导,我边学习边写下了这三篇文章。
=============================================================
首先都是从目录结构开始了:

  • EMQX
  • etc :看起来像是一些配置文件,后续分析
  • certs:放证书的
  • include:头文件
  • priv:不清楚是啥
  • scripts:启动脚本?
  • src:源代码
  • test:测试代码

仅仅列出了文件夹,子文件未列。

按照启动顺序,走一遍程序:

  1. 通过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. 启动主监控树

  1. emqx_kernal_sup:
    1)emqx_pool_sup: 进程池管理器
    2)emqx_hooks: 回调管理器
    3)emqx_stats: 计数器
    4)emqx_metrixs: 返回码或者状态判定
    5)emqx_ctl: 命令行命令管理
    6)emqx_zone: 定义不同的监听器(Listener)域
  2. emqx_router_sup: 对Topic的路由
    1)router pool
    2)router helper
  3. emqx_broker_sup: 功能处理逻辑:订阅,取消订阅,发布
    1)broker pool
    2)share subscribe (MQTT5.0新特性,暂不管)
    3)broker helper
  4. 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主要人口
  5. emqx_sys_sup: 主要是一些监控进程
    1)emqx_sys
    2)emqx_sys_mon
    3)emqx_os_mon
    4)emqx_vm_mon

c. 模块加载
d. 插件初始化和加载
e. 确认成功启动listener

  1. 启动MQTT/TCP: esockd模块
  2. 启动MQTT/SSL: esockd模块
  3. 启动MQTT/WS: cowboy模块
  4. 启动MQTT/WSS:cowboy模块
    esockd模块,后续再解释,启动时会将emqx_connection回调传过去
    cowboy模块,回调为emqx_ws_connection

f. 启动ekka,auto_cluster
g. 加载emqx_alarm 告警模块

到此,整个服务启动完成,下一篇会继续探索emqx客户端连接行为。

相关文章

网友评论

      本文标题:EMQX源码阅读(一)

      本文链接:https://www.haomeiwen.com/subject/mnvgactx.html