gen_server瓶颈

如果只维护了一个gen_server进程来处理大多数请求将造成。进程忙不过来,消息队列不大断增大,需要消耗更多的堆内存。最后会导致VIM崩溃。

方法1: 此方法有个缺点 spawn 创建+销毁成本非常高.

我采用gen_server作为第三方服务放入到系统中,为了解决瓶颈问题
我在handle_call里面采用noreply,且只创建一个进程Pid,然后给此进程Pid发消息,剩下的业务逻辑交给Pid进进程处理.计算完进程自动销毁(receive没有循环)
31 handle_call({testnoreply}, From, Tab) ->

32 Pid = spawn(?MODULE, test_reply,[]),
33 Pid ! {From,test},
34 {noreply, Tab};
业务逻辑放在test_reply处理
22 test_reply()->
23 receive
24 {From, X} ->
25 io:format(“X===~p,=From=~p==~n”,[X,From]),
26 gen_server:reply(From,test)
27 end.

方法2:创建更多的gen_server PID处理 提高消费队列,如果个进程状态共享的话有点繁琐。

方法3:用一个单独的node来处理,同方法2类似

方法4:采用redis消息队列--所以对于大量的消息处理的系统,首先要考虑的就是架构一个消息队列集群

在此谢谢 yufeng\ licuangang\zhaoweiguo

相关资料

http://blog.yufeng.info/archives/1438

你可能感兴趣的:(server)