文档章节

ranch

hncscwc
 hncscwc
发布于 2014/06/06 20:19
字数 727
阅读 58
收藏 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找到对应的连接池监督者进程, 并消息通知最新的配置信息.

© 著作权归作者所有

共有 人打赏支持
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
gen_server的enter_loop分析

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

智深
2013/04/02
0
3
2016

眼睛一闭一睁,2016就这样过去了 技术 私有pod库封装实践 简介:cocoapods私有仓库封装过程中的思考 功能性封装 业务型封装 纯Swift开发项目 入门: 进阶:swift进阶 实践:TFA、HBI企业项目...

AliThink
2016/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链入门教程以太源码分析accounts包简介

兄弟连区块链教程以太源码分析accounts包简介 accounts包实现了eth客户端的钱包和账户管理。 账号的数据结构: typeAccount struct {Address common.Address `json:"address"` // Ether...

兄弟连区块链入门教程
25分钟前
4
0
sed命令详解及运用

10月17日任务 9.4/9.5 sed 9.3、正则介绍 - sed命令(上) sed是流编辑器,默认不编辑源文件,是以行为单位从源文件抽取数据,进而处理再输出于屏幕上;可能有的人说那我直接vi不就好了嘛,但...

zgxlinux
27分钟前
2
0
iOS App “去评分” 功能的几种实现总结

通常 App 都会在它的设置页面或者关于页面添加一个“去评分”选项,或者在用户使用 App 过程中适当时机弹窗,引导用户跳转到 App Store 对当前 App 进行评分或者撰写评论。 绝大部分 App 实现...

秦无炎
32分钟前
1
0
Chrome 图片解码与 Image Decoding Hint

我在之前的一篇文章Chrome 图片解码与 Image.decode API,说明了为什么图片解码可能会导致非合成器动画的阻塞和如何使用 Image.decode API 来避免动画的阻塞。不过虽然 Image.decode API 给页...

全部原谅
33分钟前
0
0
java获取ip和地区

String s = HttpUtil.sendPost("http://pv.sohu.com/cityjson");JSONObject jsonObject = JSONObject.parseObject(s.substring(s.indexOf("{"), s.indexOf("}") + 1));jsonObject.get("c......

吴伟祥
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部