esock启动流程 最近研究了EMQ源码,发现里面采用最多的就是各种框架,如gen_server、supervisor监督机制,esock框架等,前段时间整理了一下esock使用启动流程,今天分享一下。整理的不够完善,请大家指正! 启动方式: supervisor:start_child启动参数: supervisor/transient/infinity启动监督者启动connection启动方式: supervisor:start_child启动参数: supervisor/transient/infinity此处唯一关联为 mfargs异步创建一个进程此处内部会有阻塞操作,等待go信号的到来通知Sock可以接收数据启动accept启动方式: supervisor:start_child启动参数: supervisor/transient/infinity异步调用第三方accept请求,这里连线表明在该模块下发生同步调用大于最大连接数小于最大连接数使用apply动态调用conn时添加的emqttd_client模块中的函数判断上述call调用的返回值启动listen启动方式: supervisor:start_child启动参数: worker/transient/16小于启动方式: supervisor:start_child启动参数: worker/transient/5000大于esockd:openesockd_sup:start_listeneresockd_listener_sup:start_linkSup=supervisor:start_linkconnectionesockd_connection_sup:start_linkgen_server:start_linkinitprocess_flag trap_exit, true返回record记录: max_clients/conn_opts/access_rules/shutdown/mfargs/loggeremqttd_client:start_linkproc_lib:spawn_link 异步很重要initConn0:waitdo_initrun_socketConn:async_recvgen_server2:enter_looploop: 循环接收数据及业务处理acceptesockd_acceptor_sup:start_linksupervisor:start_linkinit: esockd_acceptor, start_linkesockd_acceptor:start_linkgen_server:start_linkinitap_server_init返回记录状态: lsock/sockfun/tunefun/sockname/conn_sup/statsfun/loggerhandle_castacceptprim_inet:async_accept,激活LSock句柄handle_infoinet_db:lookup_socket 查询LSock的加载模块inet_db:register_socket 注册建联的Sockesockd_connection_sup:start_connectiongen_server:callcurrclientsendcheck_aclesockd_connection:new 创建esockd_connection,该结构很重要Conn:start_linkcontrolling_process 修改进程控制权限,后续数据发送在新的Sock上Conn:golistenesockd_listener:start_linkgen_server:start_linkinitprocess_flagesockd_transport:listenAcceptNum判断esockd_acceptor_sup:start_acceptorsupervisor:start_childstate: protocol/listen_on/options/lsock/laddress/LPort