文档章节

ranch

hncscwc
 hncscwc
发布于 2014/06/06 20:19
字数 727
阅读 62
收藏 0

1. 简单介绍

ranch是一个使用erlang开发的socket acceptor pool for TCP protocols.

cowboy中使用ranch作为网络通信的基础

2. 使用

(1) 启动ranch应用

application:start(ranch).

(2) 侦听接收

ranch:start_listener(Ref, NbAcceptors,
                     Transport, TransOpts,
                     Protocol, ProtoOpts).

其中

Ref:  标识该侦听的唯一标识

NbAcceptors:  acceptor进程的个数

Transport:  传输模块的名称, 通常为 ranch_tcp或ranch_ssl

TransOpts:  侦听的相关选项参数

                 默认的选项参数有 binary, {active, false}, {packet, raw}, {reuseaddr, true}

                 注意: 这几个默认的参数在调用start_listeners时不能更改, 但可以调用Transport:setopts/2进行修改

                 其他选项参数有 侦听端口:{port, Port}, 最大连接数: {max_connections, MaxConn}

Protocol:  回调协议解析模块

ProtoOpts:  回调协议解析模块的所需参数

例如

ranch:start_listener(client, 10, 
                     ranch_tcp,
                     [{port, 80}, {max_connections, infinity}],
                     cowboy_protocol, []).

(3) 协议解析模块

该模块需要实现ranch_protocol行为, 即导出start_link/4函数. 该函数会由ranch_conns_sup进行回调, 该函数返回一个进程pid——{ok, Pid}.

回调start_link/4 传入的四个参数为 侦听的唯一标识Ref, 新连接的socket句柄Sock, 传输模块名称Transport以及协议解析模块的参数(ranch:start_listener中传入的).

在协议解析模块中, 通过调用传输模块提供的 recv/3 和 send/2 接口完成数据的收发工作。

3.  内部细节

(1) 监督树

ranch应用启动会默认创建ranch_sup进程和ranch_server进程, 当调用ranch:start_listerner后, 创建ranch_listener_sup, ranch_conns_sup, ranch_acceptor_sup等进程, 关系如上图所示. 多次调用start_listerner接口时, 会有多个ranch_listener_sup进程以及它的子进程.

(2) start_listener的流程

注意两个同步流程

1) ranch_acceptor进程调用start_protocol同步等待ranch_conns_sup进程回复, 用于控制最大连接数

2) 协议解析模块需调用ranch:accept_ack/1 同步等待ranch_conns_sup回复后, 才能真正进行数据的接收。

ranch_conns_sup.erl
start_protocol(SupPid, Socket) ->
    SupPid ! {?MODULE, start_protocol, self(), Socket},
    receive
        SupPid ->
            ok
    end.


loop(...)
    receive
        {?MODULE, start_protocol, To, Socket} ->
            case Protocol:start_link(Ref, Socket, Transport, Opts) of
                {ok, Pid} -> 
                    Transport:controlling_process(Socket,Pid),
                    Pid ! {shoot, Ref},
                    put(Pid, true),
                    CurConns2 = CurConns + 1,
                    if CurCons2 < MaxConns ->
                           To ! self(),
                           loop(...);
                       true ->
                           loop(...)
                    end;
                _ ->
                    To ! self(),
                    Transport:close(Socket),
                    loop(...)
            end;
        ...

ranch.erl
accept_ack(Ref) ->
    receive
        {shoot, Ref} ->
            ok
    end.

(3)  ranch_server进程

该进程的作用是记录通过调用start_listerner侦听的相关信息, 包括

侦听端口:  ets:insert(?TAB, {{port, Ref}, Port})

最大连接数:  ets:insert(?TAB, {{max_conns, Ref}, MaxConns})

协议解析参数:  ets:insert(?TAB, {{opts, Ref}, Opts})

连接池监督者进程:  ets:insert(?TAB, {{conns_sup, Ref}, Pid})

记录这些信息的目的是为了动态进行设置.

ranch_server:set_max_connections(Ref, MaxConnections)
ranch_server:set_new_listener_opts(Ref, MaxConnections, Opts)
ranch_server:set_protocol_optsions(Ref, ProtoOpts)

通过这些接口可进行动态设置, 这几接口的实现都是向ranch_server进程投递消息, ranch_server收到消息后更新ets表中的数据, 并根据ref找到对应的连接池监督者进程, 并消息通知最新的配置信息.

© 著作权归作者所有

共有 人打赏支持
上一篇: Git详解系列整理
下一篇: cowboy源码分析
hncscwc
粉丝 67
博文 70
码字总数 76137
作品 0
杭州
程序员
私信 提问
erlang连接acceptor池ranch源码分析

终于把ranch看完了,放到了github上,https://github.com/astutesparrow/ranch 为了阅读方便,把版权信息去掉了,加上了所有的中文注释,和我自己的理解,doc目录有画了一张监督树的图 只是为...

智深
2013/04/12
0
1
erlang连接池

ranch: https://github.com/ninenines/ranch esockd: https://github.com/emqtt/esockd ranch现在资料多,esockd暂时还比较少资料。 esockd是站在rabbitmq-server的肩膀上,可能起点比较好。...

格通
2016/02/23
39
0
《ios编程》书评活动最后两天!!

本次书评活动书名:《iOS编程》,感谢华中科技大学出版社对本次活动书籍奖品的赞助! 活动时间:2014年04月 08 日~2014年04月 15 日 活动规则:1.样章试读,跟原帖写书评; 2.挑选出10篇优秀...

丫头潘潘
2014/04/14
1K
19
【写书评赠书活动】《iOS编程》

本次书评活动书名:《iOS编程》,感谢华中科技大学出版社对本次活动书籍奖品的赞助! 活动时间:2014年04月 08 日~2014年04月 15 日 活动规则:1.样章试读,跟帖写书评; 2.挑选出10篇优秀书...

丫头潘潘
2014/04/08
3.1K
37
gen_server的enter_loop分析

在看ranch user guide的过程中,发现实现protocol handler需要使用特殊的genserver形式,也就是enterloop函数调用,事例代码如下: -module(echo_protocol).-behaviour(ranch_protocol). -ex...

智深
2013/04/02
0
3

没有更多内容

加载失败,请刷新页面

加载更多

Neo 虚拟机

上一篇《Neo 编译器》中说明了Neo编译器是怎么把CIL转成neo虚拟机的opcode,那么vm虚拟机又是怎么处理这些代码的,这篇文章我们看一下虚拟机的代码。 框架 虚拟机所处的位置 在框架图中,我们...

NEO-FANS
31分钟前
1
0
TiDB-Lightning Toolset & TiDB-DM 正式开源,前排开“坑”、PR 走起!

在刚刚结束的 TiDB DevCon 2019 上,我们宣布将大家期待已久的 TiDB-Ligthning Toolset 和 TiDB-DM 开源(惊不惊喜、意不意外?!),感兴趣的小伙伴们赶紧前排关注一波,开“坑(issues)”...

TiDB
45分钟前
2
0
人人都可以做深度学习应用:入门篇

本文由云+社区发表 作者:徐汉彬 一、人工智能和新科技革命 2017年围棋界发生了一件比较重要事,Master(Alphago)以60连胜横扫天下,击败各路世界冠军,人工智能以气势如虹的姿态出现在我们...

腾讯云加社区
49分钟前
1
0
C++ RAII

C++ RAII RAII是resource acquisition is initialization的缩写,意为“资源获取即初始化”。它是C++之父Bjarne Stroustrup提出的设计理念,其核心是把资源和对象的生命周期绑定,对象创建获...

mskk
52分钟前
1
0
web.xml is missing and is set to true一步解决

次报错说的是在WebContent/WEB-INF下面没有web.xml,而默认web.xml不在此路径,需要重新指定路径,操作如下: 先取消Dynamic Web Module勾选,点击apply,然后再勾上Dynamic Web Module,此时...

宇昕
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部