我的gen_server会成为瓶颈吗?

时间:2012-08-18 13:19:33

标签: erlang gen-server

我目前正在用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次更新仅在使用更新更新其值后的1000 * 3000毫秒内完成/ 1。

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

1 个答案:

答案 0 :(得分:3)

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

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

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