文档章节

ranch

hncscwc
 hncscwc
发布于 2014/06/06 20:19
字数 727
阅读 55
收藏 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
粉丝 66
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS开发用到的图片尺寸汇总

启动图 型号 竖屏 横屏 iPhone SE 640px × 1136px 1136px × 640px iPhone 6s 750px × 1334px 1334px × 750px iPhone 6s Plus 1242px × 2208px 2208px × 1242px iPhone 7 750px × 1334......

业界小白
22分钟前
0
0
浅谈redis

redis是一个开源,内存式的健值存储数据库,也被称为健值存储的字典服务器。健值类型有字符串,hash(哈希类型),set(集合),list(列表) 和有序集合 特征细节: 内存式:redis将健值存储在主...

拐美人
29分钟前
0
0
无限扩容,按需使用!ZStack推出基于阿里云NAS的文件存储服务

日前,ZStack发布2.6.0版本,正式宣布推出基于阿里云NAS的文件存储服务。得益于业界领先的阿里云分布式存储架构,融合NAS后的ZStack 2.6.0拥有高性能、高可靠、容量无限扩展、一键操作、按需...

ZStack社区版
31分钟前
1
0
崛起于Springboot2.X之Mongodb多数据源处理(35)

多数据源:4个mongodb库! 目录结构图: 1、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>......

木九天
37分钟前
0
0
如何获取显示器的EDID信息

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果...

DB_Terrill
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部