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

EMQX源码阅读(二)

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

本次主要探讨esockd项目

接上一篇:

%% Start MQTT/TCP listener
-spec(start_listener(esockd:proto(), esockd:listen_on(), [esockd:option()])
      -> {ok, pid()} | {error, term()}).
start_listener(tcp, ListenOn, Options) ->
    start_mqtt_listener('mqtt:tcp', ListenOn, Options);

%% Start MQTT/TLS listener
start_listener(Proto, ListenOn, Options) when Proto == ssl; Proto == tls ->
    start_mqtt_listener('mqtt:ssl', ListenOn, Options);

start_mqtt_listener(Name, ListenOn, Options) ->
    SockOpts = esockd:parse_opt(Options),
    esockd:open(Name, ListenOn, merge_default(SockOpts),
                {emqx_connection, start_link, [Options -- SockOpts]}).

可以看到,这里使用了两个esockd函数:

  1. esockd:parse_opt/1
  2. esockd:open/3

简单看一下目录结构,发现是一个相对标准的socket server开发,listener+accepter;看一下rebar.config,并没有引用其他库,是一个使用erlang底层自行实现的基本应用。

esockd_app.erl:
启动主监控树进程

esockd_sup.erl:
启动esockd_limiter:看起来是一个用户级别的限制,桶、Token、计时器
启动esockd_server:一个计数器的gen_server进程
提供的接口有:启动、停止、重启Listener

esockd.erl:
应用的主要API入口了,直接看open方法:

  1. 根据传入的协议名称,启动相应的listener,例如传入:'mqtt:tcp'
  2. 通过esockd_listener_sup, 启动:
    a. esockd_connection_sup
    b. esockd_accepter_sup
    c. esockd_listener:
    a)esockd_transport:listen 启动监听端口Lsock
    b)根据配置AcceptNum,启动多个Accepter
    d. esockd_accepter
    收到客户端连接请求,握手成功后,调用conn_sup,启动conn
    e. esockd_connection
    判断连接数是否超过上限
    回调M:F(A),创建connection
    返回开篇,看到MFA是:{emqx_connection, start_link, [Options -- SockOpts]},这里刚好对接回主项目emqx。

相关文章

网友评论

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

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