ranch分析学习(四)

经过的前面的梳理,整个ranch框架的结构,大致有了一个清晰的脉络,即使我说的不是很清楚大家也基本能阅读懂源码。下面我继续分析剩下的的几个文件。

7.ranch_transport.erl

 这个文件是一个自定义的的erlang行为模式,主要规范实现这个行为模式的子类必须要实现那个函数,整个函数分为行为callback的定义,模块函数的定义. 模块函数的实现sendfile. 具体实现了这个行为模式定义的callback的模块有(ranch_tcp.erl,ranch_ssl.erl) 这两个文件。看对应的名字都能大致明白什么功能和作用。这两个文件我觉得是整个框架传输处理的核心模块。也是把gen_tcp 和ssl 两种 传输协议做了一个统一的对外的接口,便于对整个框架结构的处理。也便于对传输协议的扩展。在协议扩展后仍然能再框架下稳定运行起重要作用。假设我们要ranch 支持gen_udp 协议的话 也只需要一个模块使用gen_udp 对整个协议封装处理即可。ranch_transport 整个回调木块对网络传输块做了如下的高度抽象。连接,监听,应答,参数设置,数据接收,发送,文件发送,断开,关闭 等接口做了高度抽象的概括。可以说cowboy 从 http 到 https 轻松无缝切换,都得益于整个行为模式的抽象处理。

8.ranch_acceptor.erl  

start_link(LSocket, Transport, ConnsSup) ->
    Pid = spawn_link(?MODULE, loop, [LSocket, Transport, ConnsSup]),
    {ok, Pid}.

首先我们来看看start_link 的几个参数 第一个参数 连接监听的socket,第二个参数选择的传输协议 第三个参数连接监督,然后采用链接的方式开启一个线程。

flush() ->
    receive Msg ->
        error_logger:error_msg(
            "Ranch acceptor received unexpected message: ~p~n",[Msg]),
        flush()
    after 0 ->
        ok
    end.

这个文件中为什么会有flush()这个函数呢?首先这个函数主要是处理接受我们消息处理中不需要的消息,把消息信箱中比如攻击消息,等等其余无用的消息从消息信箱中移除,然后再几率日志。整个接受过程是一个0超时处理。如果整个没有这个刷新过程的话都存在一些垃圾消息存在于信箱,导致信箱消息不停的增大,内存不停的增加,最后导致内存消耗宕机。

最后我们来看看整个主循环

 1 loop(LSocket, Transport, ConnsSup) ->
 2     _ = case Transport:accept(LSocket, infinity) of
 3         {ok, CSocket} ->
 4             Transport:controlling_process(CSocket, ConnsSup),
 5             %% This call will not return until process has been started
 6             %% AND we are below the maximum number of connections.
 7             ranch_conns_sup:start_protocol(ConnsSup, CSocket);
 8         %% Reduce the accept rate if we run out of file descriptors.
 9         %% We can‘t accept anymore anyway, so we might as well wait
10         %% a little for the situation to resolve itself.
11         {error, emfile} ->
12             receive after 100 -> ok end;
13         %% We want to crash if the listening socket got closed.
14         {error, Reason} when Reason =/= closed ->
15             ok
16     end,
17     flush(),
18     ?MODULE:loop(LSocket, Transport, ConnsSup).

整个过程包括三个处理部分:第一步部分对socket accept 等待客户端连接,如果连接上以后启动一个连接处理的进程类。第二步清理消息信箱用无用的垃圾消息。第三部整个函数尾递归调用,继续等待客户端连接处理。

明天学习剩下的模块,并对整个零散的思维进行整体的梳理。

ranch分析学习(四)

时间: 2024-10-10 06:54:52

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

ranch分析学习(二)

紧接上篇,今天我们来分析监督树的工作者,打工仔执行任务的人.废话不多少我们直接进入正题. 3.ranch_server.erl   整个文件的功能主要是存储tcp对应参数的的信息.信息的存储方式采用的ets内存表的方式存储方式.当然有需求也可以采用mnesia来存储对应的数据.不过除非需要大规模集群处理,需要相同的配置,相同的参数可以考虑采用mnesia保存消息.当然有需求的同学可以自行改造. 整个代码文件遵守opt设计规范进行编写,调用api 和 行为模式回调方法分开.至于为什么要这样干,这个

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

数学建模学习笔记(第四章:5个静态优化实例分析学习)

 第四章:静态优化模型(微分法建模,求导得目标函数最优解) 现实世界中普遍存在着优化问题:静态优化模型指求解问题的最优解:重点是如何根据目的确定恰当的目标函数:一般使用微分法. 1.    存储模型:存在某种矛盾,寻找平衡最优点! a)      问题描述:配件厂为装配生产若干中产品,轮换产品时因更换设备要付生产准备费,产量大于需求时因积压资金要付存储费,该场生产能力非常大,即所需数量可在很短时间内产出. b)     问题存在:今已知某产品的日需求量为100件,生产准备费5000元,存储费为每

对discuz的代码分析学习(四)论坛入口文件

只是大致分析下执行流程,主要就是取得mod参数的值,根据取值加载控制器,控制器位置在最后一行指定了. 1 )定义应用名称,加载两个必要文件 define('APPTYPEID', 2); define('CURSCRIPT', 'forum'); require './source/class/class_core.php';//核心类 require './source/function/function_forum.php';//论坛函数库 2 )modarray数组限定了mod取值范围 $

数据分析学习方向(四)

我们在上一篇文章中给大家介绍数据分析工作中的数据预处理以及统计学知识,这些知识都是比较重要的,我们现在在这篇文章中给大家讲解一下数据分析最后一部分的知识,希望这篇文章能够给大家带来帮助. 数据分析工作是需要学习Python的,如果你有一些了解的话,就知道目前市面上其实有很多 Python 数据分析的书籍,但每一本都很厚,学习压力非常大.但其实真正最有用的那部分信息,只是这些书里很少的一部分.这就需要我们掌握回归分析的方法,通过线性回归和逻辑回归,其实你就可以对大多数的数据进行回归分析,并得出相对

第四章:源代码的下载预编译

<Android深度探索>(卷1)HAL与驱动开发读后感: 在第三章学习过Git的使用方法的基础上,本章主要介绍的是使用Git下载两套源代码,一套是安卓源代码,另一套Linux源代码.由于安卓移植主要就是Linux内核移植,所以Linux源代码是安卓的核心部分.而Linux内核移植主要是Linux驱动移植,故,为了开发和测试Linux驱动,需要在Ubuntu Linux下搭建两套开发环境:Android应用程序开发环境金额Linux内核开发环境.本章的主要目的也就是介绍如何搭建这两种开发环境,

上下文菜单和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

大数据分析学习之路

大数据分析学习之路 目录: 一.大数据分析的五个基本方面 二.如何选择适合的数据分析工具 三.如何区分三个大数据热门职业 四.从菜鸟成为数据科学家的 9步养成方案 五.从入门到精通--快速学会大数据分析                             一.大数据分析的五个基本方面 1,可视化分析 大数据分析的使用者有大数据分析专家,同时还有普通用户,但是他们二者对于大数据分析最基本的要求就是可视化分析,因为可视化分析能够直观的呈现大数据特点,同时能够非常容易被读者所接受,就如同看图说话一