服务器成为瓶颈?

我目前正在编写erlang中的一个软件,它现在基于gen_server行为。 这gen_server应该导出一个函数(我们称之为update / 1),它应该使用ssl连接到另一个在线服务,并将作为参数传递给函数的值发送给它。

目前更新/ 1是这样的:

update(Value) ->
  gen_server:call(?SERVER, {update, Value}).

所以一旦被调用,就会调用?SERVER,它的处理方式如下:

handle_call({update, Value}, _From, State) ->
    {ok, Socket} = ssl:connect("remoteserver.com", 5555,  [], 3000).
    Reply = ssl:send(Socket, Value).
    {ok, Reply, State}.

一旦数据包被发送到远程服务器,对端应该严重的连接。

现在,这对我在shell中的测试正常工作,但如果我们必须调用1000次mymod:update(Value)并且ssl:connect / 4运行不正常(即达到其超时),会发生什么情况?

在这一点上,我的gen_server将具有非常大量的值,并且它们只能被逐个处理,导致第1000次更新将在使用update / 1更新其值后仅进行1000 * 3000毫秒。

使用转换而不是通话会导致同样的问题。 我怎么解决这个问题? 我应该使用普通函数而不是gen_server调用吗?


从个人经验来看,我可以说每gen_server进程有1000条消息不会成为一个问题,除非你排队等待大消息。

如果从您的测试中看来,您的gen_server无法处理这么多负载,那么您最好在应用程序的引导时(或运行时),在supervisor进程下创建多个gen_server实例。

除此之外,我真的不明白为每次更新建立新连接的要求! 你应该考虑一些优化,如缓存连接/预连接到服务器..没有?

链接地址: http://www.djcxy.com/p/38183.html

上一篇: server become a bottleneck?

下一篇: Erlang queue problems