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:open esockd_sup:start_listener esockd_listener_sup:start_link Sup=supervisor:start_link connection esockd_connection_sup:start_link gen_server:start_link init process_flag trap_exit, true 返回record记录: max_clients/conn_opts/access_rules/shutdown/mfargs/logger emqttd_client:start_link proc_lib:spawn_link 异步很重要 init Conn0:wait do_init run_socket Conn:async_recv gen_server2:enter_loop loop: 循环接收数据及业务处理 accept esockd_acceptor_sup:start_link supervisor:start_link init: esockd_acceptor, start_link esockd_acceptor:start_link gen_server:start_link init ap_server_init 返回记录状态: lsock/sockfun/tunefun/sockname/conn_sup/statsfun/logger handle_cast accept prim_inet:async_accept,激活LSock句柄 handle_info inet_db:lookup_socket 查询LSock的加载模块 inet_db:register_socket 注册建联的Sock esockd_connection_sup:start_connection gen_server:call currclients end check_acl esockd_connection:new 创建esockd_connection,该结构很重要 Conn:start_link controlling_process 修改进程控制权限,后续数据发送在新的Sock上 Conn:go listen esockd_listener:start_link gen_server:start_link init process_flag esockd_transport:listen AcceptNum 判断 esockd_acceptor_sup:start_acceptor supervisor:start_child state: protocol/listen_on/options/lsock/laddress/LPort