Ranch模块的作用是什么

发布时间:2021-07-30 15:18:12 作者:Leah
来源:亿速云 阅读:282

Ranch模块的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

ranch_listener_sup模块

介绍

此模块是ranch调用的一个模块,用来处理所有的监听和网络连接中心。
该模块的创建时由ranch:start_listener函数启动的基于监督者进程ranch_sup的子进程

功能函数介绍

ranch_conns_sup模块

介绍

接受socket连接的进程,创建Protocol进程,并且监控这些进程的退出

功能函数介绍

ranch_acceptors_sup 连接接受监督者模块

介绍

设置监听socket,将此socket同时分发给ranch_accpetor 接受者,监听连接

函数分析

%% 通过设置receive after 0,优先处理{alarm,X}的消息。因为在超时时间为0的receive中,会立即触发一个超时,但是在此之前,
系统会尝试对邮箱进行模式匹配,所以此方法,可以对消息优先处理,可以用于清空邮箱中的所有消息。
1.优先匹配例子
priority_receive()->  
    receive
      {alarm,X}->
    after 0->
            receive
        Any->
         Any
      end
    end.
2.清空邮箱所有消息
flush(Logger) ->
	receive Msg ->
		ranch:log(warning,
			"Ranch acceptor received unexpected message: ~p~n",
			[Msg], Logger),
		flush(Logger)
	after 0 ->
		ok
	end.
节选自gen.erl
do_call(Process, Label, Request, Timeout) ->
    try erlang:monitor(process, Process) of
	Mref ->
	    %% If the monitor/2 call failed to set up a connection to a
	    %% remote node, we don't want the '!' operator to attempt
	    %% to set up the connection again. (If the monitor/2 call
	    %% failed due to an expired timeout, '!' too would probably
	    %% have to wait for the timeout to expire.) Therefore,
	    %% use erlang:send/3 with the 'noconnect' option so that it
	    %% will fail immediately if there is no connection to the
	    %% remote node.

	    catch erlang:send(Process, {Label, {self(), Mref}, Request},
		  [noconnect]),
	    receive
		{Mref, Reply} ->
		    erlang:demonitor(Mref, [flush]),
		    {ok, Reply};
		{'DOWN', Mref, _, _, noconnection} ->
		    Node = get_node(Process),
		    exit({nodedown, Node});
		{'DOWN', Mref, _, _, Reason} ->
		    exit(Reason)
	    after Timeout ->
		    erlang:demonitor(Mref, [flush]),
		    exit(timeout)
	    end
    catch
	error:_ ->
	    %% Node (C/Java?) is not supporting the monitor.
	    %% The other possible case -- this node is not distributed
	    %% -- should have been handled earlier.
	    %% Do the best possible with monitor_node/2.
	    %% This code may hang indefinitely if the Process 
	    %% does not exist. It is only used for featureweak remote nodes.
	    Node = get_node(Process),
	    monitor_node(Node, true),
	    receive
		{nodedown, Node} -> 
		    monitor_node(Node, false),
		    exit({nodedown, Node})
	    after 0 -> 
		    Tag = make_ref(),
		    Process ! {Label, {self(), Tag}, Request},
		    wait_resp(Node, Tag, Timeout)
	    end
    end.

从上面代码中可以看到,是在本地进程monitor了被call的进程,并且erlang:send的方式发送信息,此时再receive一个阻塞等待结果返回,然后再TimeOut的时候,如果还没有返回,则返回给进程exit(timeout)的错误信息。所以,就会出现,虽然timeout了,被调的进程还是会处理完,而不能当作被调进程没有收到处理。
如何避免?:1,从源头避免,确保call的进程处理信息足够简单,不超时 2.采用cast,或 ! 替代处理
参考网址:Erlang中带超时的receive

ranch_acceptor模块

简介

此模块用来接收外部的socket连接。并通知ranch_conns_sup通知业务进程启动并且绑定到该socket进程

函数介绍

4.参考网址:
[erlang-questions] {error,emfile}
从EMFILE和ENFILE说起,fd limit的问题(一)
EMFILE,too many open files的解决方案

此处记录问题:

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

推荐阅读:
  1. Nodejs中cluster模块的作用是什么
  2. Node中buffer模块的作用是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:Ubuntu怎么安装docker ce、docker-compose、docker-machine

下一篇:怎么重新设置Ubuntu的登录密码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》