ranch分析学习(二)

紧接上篇,今天我们来分析监督树的工作者,打工仔执行任务的人。废话不多少我们直接进入正题。

 3.ranch_server.erl

    整个文件的功能主要是存储tcp对应参数的的信息。信息的存储方式采用的ets内存表的方式存储方式。当然有需求也可以采用mnesia来存储对应的数据。不过除非需要大规模集群处理,需要相同的配置,相同的参数可以考虑采用mnesia保存消息。当然有需求的同学可以自行改造。

  整个代码文件遵守opt设计规范进行编写,调用api 和 行为模式回调方法分开。至于为什么要这样干,这个就的仔细研究哈 otp行为模式。

  首先我看来看init方法    

init([]) ->
    Monitors = [{{erlang:monitor(process, Pid), Pid}, Ref} ||
        [Ref, Pid] <- ets:match(?TAB, {{conns_sup, ‘$1‘}, ‘$2‘})],
    {ok, #state{monitors=Monitors}}.

  这个方法主要是进程启动的时候一个初始过程,来看看这个工人开始工作的时候都往包包里放了什么资料呢?等等什么包包呢,这个包包从哪里来。放的资料从那里来的?首先说说包包,这个包包就是自己的进程状态,循环数据,进程启动时候 自己给自己弄来的。至于放的东西自然从 ets 表格存储的东西来的。大家还记得ranch_sup中的 ranch_server = ets:new(ranch_server, [ordered_set, public, named_table]), 这一句吧,这个就是在内存存储数据的建表过程,相当于资料库的建立。或许有人要问为什么不在 init 做这事情。很明确告诉大家 不能在init 里面干这事情,要是工人干活不认真,被监工炒鱿鱼了,那不要重新开干,一切数据,核心资料都没有了。这对公司是重大损失。在外面初始的话 就像这个工人一样,启动的时候就可以从资料库取出资料继续工作。(ranch_sup 子进程的规范参数我认为是无用可以探讨)Monitors 这个列表里面存的就是实现了ranch_protocol 行为模块的数据,具体的我们后面我们用到的时候在研究。提一下 monitor 和 link 这两个方法 大家可以查看doc研究一下。至此一个工人的初始工作都干完了。

  在这个文件中,我觉得关键点就这,其余的函数方法就是数据的存储,读取的实现过程。函数的主要功能设置连接参数,程序端口,最大连接个数,协议选项,连接个数的读取或者写入,或者删除。

这个在发布的应用用,也可以提供查询对应模块的函数最大连接,当前连接数,等等,但是不建议直接调用。最好通过ranch对外统一接口api 调用。这里仅仅说名有这个功能而已。

 作为演示 测试使用,开发环境当心使用。

([email protected])6> ranch_server:count_connections(game_tcp_server).没有连接的时候的结果
0
([email protected])7> ranch_server:count_connections(game_tcp_server).有一个连接后的结果
1

4.ranch_protocol.erl

-callback start_link(
        Ref::ranch:ref(),
        Socket::any(),
        Transport::module(),
        ProtocolOptions::any())
    -> {ok, ConnectionPid::pid()}.

   要使用ranch框架,使用模块必须要实现的行为函数。 四个参数 依次是模块注册的名字,socket套节字,模块协议,参数。我想下面的输出更直接清楚明白。

打印:io:format("Ref:~p Socket:~p Transport: ~p Otps: ~p~n",[Ref,Socket,Transport,Opts]),
输出:Ref:game_tcp_server Socket:#Port<0.14570> Transport: ranch_tcp Otps: []

5.ranch_listener_sup.erl

 1 -module(ranch_listener_sup).
 2 -behaviour(supervisor).
 3
 4 -export([start_link/6]).
 5 -export([init/1]).
 6
 7 -spec start_link(ranch:ref(), non_neg_integer(), module(), any(), module(), any())
 8     -> {ok, pid()}.
 9 start_link(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) ->
10     MaxConns = proplists:get_value(max_connections, TransOpts, 1024),
11     ranch_server:set_new_listener_opts(Ref, MaxConns, ProtoOpts),
12     supervisor:start_link(?MODULE, {
13         Ref, NbAcceptors, Transport, TransOpts, Protocol
14     }).
15
16 init({Ref, NbAcceptors, Transport, TransOpts, Protocol}) ->
17     AckTimeout = proplists:get_value(ack_timeout, TransOpts, 5000),
18     ConnType = proplists:get_value(connection_type, TransOpts, worker),
19     Shutdown = proplists:get_value(shutdown, TransOpts, 5000),
20     ChildSpecs = [
21         {ranch_conns_sup, {ranch_conns_sup, start_link,
22                 [Ref, ConnType, Shutdown, Transport, AckTimeout, Protocol]},
23             permanent, infinity, supervisor, [ranch_conns_sup]},
24         {ranch_acceptors_sup, {ranch_acceptors_sup, start_link,
25                 [Ref, NbAcceptors, Transport, TransOpts]},
26             permanent, infinity, supervisor, [ranch_acceptors_sup]}
27     ],
28     {ok, {{rest_for_one, 10, 10}, ChildSpecs}}.

这是一个监督树,里面的 proplists 有专业的解释。我要说明的是这个监督树干的事情,它首先启动一个监督进程,然后一个连接监督进程,一个监听处理监督进程,负责子模块的socket监听连接处理。每一个子模块都会有对应的进程。这就保证了整个子程序的稳定性,和容错性。其余的都比较简单,今天的学习就到这里,明天我们继续

  

 

ranch分析学习(二)

时间: 2024-10-19 16:25:12

ranch分析学习(二)的相关文章

ranch分析学习(一)

Ranch 是一个tcp处理的程序框架.官方的解释  Ranch is a socket acceptor pool for TCP protocols. 主要目的是提供一个方便,易用,高效,稳定的tcp处理基础程序.前面我也用它作为基础写了个简易的聊天的程序.cowboy底层通信处理也是ranch处理,聊聊数十个个文件做为基础的http服务器.今天我们就来看看它到底有什么魔力.废话不多,接下的几天我将分析它,说说我的学习心得.如果有什么地方说的不对还请大家指正. 源码下载地址: https:/

ranch分析学习(三)

接着上一篇继续研究 上一篇结尾的时候,我们谈到了连接,监听两个监督树,今天我们就来看看这两个监督树和他们的工作者都是干什么的,怎么实现的.文件编号接上篇. 6. ranch_acceptors_sup.erl 1 -module(ranch_acceptors_sup). 2 -behaviour(supervisor). 3 4 -export([start_link/4]). 5 -export([init/1]). 6 7 -spec start_link(ranch:ref(), non

ranch分析学习(四)

经过的前面的梳理,整个ranch框架的结构,大致有了一个清晰的脉络,即使我说的不是很清楚大家也基本能阅读懂源码.下面我继续分析剩下的的几个文件. 7.ranch_transport.erl 这个文件是一个自定义的的erlang行为模式,主要规范实现这个行为模式的子类必须要实现那个函数,整个函数分为行为callback的定义,模块函数的定义. 模块函数的实现sendfile. 具体实现了这个行为模式定义的callback的模块有(ranch_tcp.erl,ranch_ssl.erl) 这两个文件

V4L2框架分析学习二

转载于:http://www.techbulo.com/1198.html v4l2_device v4l2_device在v4l2框架中充当所有v4l2_subdev的父设备,管理着注册在其下的子设备.以下是v4l2_device结构体原型(去掉了无关的成员): struct v4l2_device { structlist_head subdevs; //用链表管理注册的subdev charname[V4L2_DEVICE_NAME_SIZE]; //device 名字 structkre

ranch 源码分析(二)

接上ranch 源码分析(一) 上次讲到了ranch.erl的start_listener函数,下面我们详细分析下这个函数 -module(ranch). %...... 省略若干行 -spec start_listener(ref(), non_neg_integer(), module(), any(), module(), any()) -> supervisor:startchild_ret(). start_listener(Ref, NbAcceptors, Transport, T

python数据分析学习(2)pandas二维工具DataFrame讲解

目录 二:pandas数据结构介绍 ??下面继续讲解pandas的第二个工具DataFrame. 二:pandas数据结构介绍 2.DataFarme ??DataFarme表示的是矩阵的数据表,包含已排序的列集合,是一个二维数据工具.每一列可以是不同的数据类型值.它既有行索引又有列索引,可以看作是一组共享相同索引的Series对象.DataFarme的数组方法有很多,比如用index.name获取某列的值,用values获取行的值.这里先介绍一些常用的知识. ??(1)构建DataFrame

对discuz的代码分析学习(二)首页文件

如果当前地址栏存在查询字符,并且是一个数字,条件成立. 查询字符:www.baidu.com/index.php?aaa=bbb              aaa=bbb就是查询字符如果条件成立,则把home赋值给$_ENV['curapp'] ;  $_ENV可以理解为类似于$_GET的超全局数组.这里的$_ENV['curapp']可以理解为选中的入口文件.并将一个数组传递给$_GET,数组的第一个成员指定了控制器名称,第二个成员制定了一个叫uid的参数,就是用户id. 如果这里的条件成立了

上下文菜单和Contextual Action Mode(学习Android Programming The Big Nerd Ranch Guide)

在Android Programming The Big Nerd Ranch Guide书中,讲解上下文菜单的实现,添加一个删除菜单. 在Honeycomb发布前的设备里,上下文的action都是以悬浮的上下文菜单形式呈现.在之后的设备里,推荐用上下文的action bar的方式去呈现上下文的action.上下文的action bar展现在一个activity的顶部. 运行在Honeycomb之前版本的程序,有些也会出现上下文action bar.那是因为它使用了第三方库,这个库名字是Acti

陆上物探测量基本理论之二---基准

基准(Datum) 坐标系统,如经纬度,需要能够数学定义的具备子午线(meridian).纬线的形状,和已确定的原点.定向参数等.全球.洲际和地区地图上的经纬度坐标通常是以格林尼治为本初子午线,以南北极为90度.然而,精确地大地测量需要更多的准确定义,基准就是一个选定的椭球和一系列地理坐标系(geographic coordinate system)的定义参数. 区域基准(regional),有时称作当地基准(local),具有自己的原点,一些物理点和参考方位.例如,NAD-27的原点就是在堪萨