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)> ranch_server:count_connections(game_tcp_server).没有连接的时候的结果 (game@thinkpad)> ranch_server:count_connections(game_tcp_server).有一个连接后的结果
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
-module(ranch_listener_sup).
-behaviour(supervisor). -export([start_link/]).
-export([init/]). -spec start_link(ranch:ref(), non_neg_integer(), module(), any(), module(), any())
-> {ok, pid()}.
start_link(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) ->
MaxConns = proplists:get_value(max_connections, TransOpts, ),
ranch_server:set_new_listener_opts(Ref, MaxConns, ProtoOpts),
supervisor:start_link(?MODULE, {
Ref, NbAcceptors, Transport, TransOpts, Protocol
}). init({Ref, NbAcceptors, Transport, TransOpts, Protocol}) ->
AckTimeout = proplists:get_value(ack_timeout, TransOpts, ),
ConnType = proplists:get_value(connection_type, TransOpts, worker),
Shutdown = proplists:get_value(shutdown, TransOpts, ),
ChildSpecs = [
{ranch_conns_sup, {ranch_conns_sup, start_link,
[Ref, ConnType, Shutdown, Transport, AckTimeout, Protocol]},
permanent, infinity, supervisor, [ranch_conns_sup]},
{ranch_acceptors_sup, {ranch_acceptors_sup, start_link,
[Ref, NbAcceptors, Transport, TransOpts]},
permanent, infinity, supervisor, [ranch_acceptors_sup]}
],
{ok, {{rest_for_one, , }, ChildSpecs}}.
这是一个监督树,里面的 proplists 有专业的解释。我要说明的是这个监督树干的事情,它首先启动一个监督进程,然后一个连接监督进程,一个监听处理监督进程,负责子模块的socket监听连接处理。每一个子模块都会有对应的进程。这就保证了整个子程序的稳定性,和容错性。其余的都比较简单,今天的学习就到这里,明天我们继续
P4V%5X4Q59SIN1W4$8M1.jpg)
ranch分析学习(二)的更多相关文章
- ranch分析学习(一)
Ranch 是一个tcp处理的程序框架.官方的解释 Ranch is a socket acceptor pool for TCP protocols. 主要目的是提供一个方便,易用,高效,稳定的t ...
- ranch分析学习(四)
经过的前面的梳理,整个ranch框架的结构,大致有了一个清晰的脉络,即使我说的不是很清楚大家也基本能阅读懂源码.下面我继续分析剩下的的几个文件. 7.ranch_transport.erl 这个文件是 ...
- ranch分析学习(三)
接着上一篇继续研究 上一篇结尾的时候,我们谈到了连接,监听两个监督树,今天我们就来看看这两个监督树和他们的工作者都是干什么的,怎么实现的.文件编号接上篇. 6. ranch_acceptors_sup ...
- V4L2框架分析学习二
转载于:http://www.techbulo.com/1198.html v4l2_device v4l2_device在v4l2框架中充当所有v4l2_subdev的父设备,管理着注册在其下的子设 ...
- ranch 源码分析(二)
接上ranch 源码分析(一) 上次讲到了ranch.erl的start_listener函数,下面我们详细分析下这个函数 -module(ranch). %...... 省略若干行 -spec st ...
- Python数据分析学习(二)
转摘:https://segmentfault.com/a/1190000015613967 本篇将继续上一篇数据分析之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目.结合两篇文章通过数据分 ...
- python数据分析学习(2)pandas二维工具DataFrame讲解
目录 二:pandas数据结构介绍 下面继续讲解pandas的第二个工具DataFrame. 二:pandas数据结构介绍 2.DataFarme DataFarme表示的是矩阵的数据表,包含 ...
- 对discuz的代码分析学习(二)首页文件
如果当前地址栏存在查询字符,并且是一个数字,条件成立. 查询字符:www.baidu.com/index.php?aaa=bbb aaa=bbb就是查询字符如果条件成立,则把 ...
- Python数据分析学习(二):Numpy数组对象基础
1.1数组对象基础 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...
随机推荐
- Linux服务器上ftp的搭建和使用
知识点: 1. FTP的简介.工作原理 2.在Linux上搭建FTP服务器 参考: 阿里云文档:https://help.aliyun.com/knowledge_detail/60152.html ...
- 将应用注册为Linux的服务
主流的Linux大多使用init.d或systemd来注册服务.下面以centos6.6演示init.d注册服务:以centos7.1演示systemd注册服务. 1. 基于Linux的init.d部 ...
- codeforces781D Axel and Marston in Bitland
题目链接:codeforces781D 正解:$bitset$+状压$DP$ 解题报告: 考虑用$f[t][0.1][i][j]$表示从$i$出发走了$2^t$步之后走到了$j$,且第一步是走的$0$ ...
- hiho#1080 更为复杂的买卖房屋姿势 线段树+区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- 我的Android学习路线(二)
这两天的主要工作: 优化了一下布局界面,原本使用的是相对布局,直观省力,但是考虑了一下还是使用更加主流的线性布局. 完善了一下计算器的功能,比如加入小数运算. 使用线性布局的思路可以用下面的伪代码表示 ...
- Kafka消息topic分区
kafka是为分布式环境设计的,因此如果日志文件,其实也可以理解成消息数据库,放在同一个地方,那么必然会带来可用性的下降,一挂全挂,如果全量拷贝到所有的机器上,那么数据又存在过多的冗余,而且由于每 ...
- SQL 2008R2还原对于服务器失败 备份集中的数据库与现有数据库 3154错误
以前用sql server 2005的时候就遇到过类似的问题,数据库在别的服务器上备份后,在本机无法还原,这次终于找到了解决方案,网上的没有找到类似的,希望能帮到大家! 原因分析:在SQL Serve ...
- Codeforces Round #424
基本全是水题 第一题水,不过有hack点,先增后不变再减 #include<map> #include<set> #include<cmath> #include& ...
- 启用/禁用以太网的批处理,用于一个网卡切换本地网络和wifi使用(Win10)
注意下面时英文版上默认网络使用,同时接入了网线和wifi时,本地网络优先wifi. 所以禁用本地网络就会自动连接到wifi,启用本地网络,就会禁用wifi. 批处理支持 -y 参数,跳过用户输入y,代 ...
- 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...