【问题标题】:Can my gen_server become a bottleneck?我的 gen_server 会成为瓶颈吗?
【发布时间】:2012-08-14 16:13:28
【问题描述】:

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

目前update/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 更新其值后仅 1000*3000 毫秒完成/1.

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

【问题讨论】:

  • 在 erlang 中,如果您需要同时发生某些事情,则生成一个进程。我在这里不完全理解您系统的语义,但为什么不能 handle_call 使用进程池来完成工作?
  • 每次需要更新值时生成一个进程

标签: erlang gen-server


【解决方案1】:

根据个人经验,我可以说每个 gen_server 进程 1000 条消息不会成为问题,除非您将大消息排队。

如果从您的测试看来,您的 gen_server 似乎无法处理这么多负载,那么您必须在应用程序的启动时(或运行时)最好在主管进程下创建 gen_server 的多个实例。

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

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多