Ranch:
简单来说,Ranch就是一个tcp acceptor pool,用于高并发下的tcp连接建立与管理。可以设置并发链接最大数量,在不关闭socket连接的情况下可以动态升级连接池。Cowboy就是使用的ranch。
https://github.com/ninenines/ranch
下面通过改造ranch自带的reverse example实现简易的服务端。
game_server.app.src
{application, game_server, [
{description, "Ranch TCP reverse example."},
{vsn, "1"},
{modules, []},
{registered, []},
{applications, [
kernel,
stdlib,
ranch
]},
{mod, {game_server_app, []}},
{env, []}
]}.
game_server_app.erl
-module(game_server_app).
-behaviour(application).
-export([start/2, stop/1]).
%% start/2
start(_Type, _StartArgs) ->
{ok, _Pid} = ranch:start_listener(tcp_reverse, 1,
ranch_tcp, [{port, 5555},{max_connections, 10240}], game_protocol, []),
game_server_sup:start_link().
%% stop/1
stop(State) ->
ok.
这里注意ranch:start_listener(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) -> {ok, pid()} | {error, badarg}.
最大连接数max_connections就是在这里进行设定, 默认值1024. NbAcceptors, Acceptor的数量,具体数值要根据实际并发设置。
Ranch接受请求并建立连接,然后就会将具体的处理交给实现了ranch_protocol行为的game_protocol,erlang中的behaviour跟java中的接口差不多。
game_server_sup.erl
-module(game_server_sup).
-b