美文网首页
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