zoukankan      html  css  js  c++  java
  • 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 调用。这里仅仅说名有这个功能而已。

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

    (game@thinkpad)6> ranch_server:count_connections(game_tcp_server).没有连接的时候的结果
    0
    (game@thinkpad)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}}.
    View Code

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

     

      

     

  • 相关阅读:
    修改hive内存限制
    hbase的regionserver宕机
    hbase的regionserver宕机
    根据硬件配置后mapred-site.xml和yarn-site.xml
    根据硬件配置后mapred-site.xml和yarn-site.xml
    阿里RDS备份恢复
    Spring框架(一)
    JVM垃圾回收机制(二)
    JVM垃圾回收机制(一)
    SpringBoot中的入口类SpringApplication
  • 原文地址:https://www.cnblogs.com/codew/p/3835975.html
Copyright © 2011-2022 走看看