2012-10-05 39 views
0

我在生产中遇到了令人讨厌的问题。我们与官方erlang pb客户端建立连接池。一切正常。为了组织池我们使用hottub(我们尝试了几个,但这是最简单的)。每个连接在3-5分钟内至少使用一次(生产现在未满载)。Riak连接池沉默断开

几天后,riak服务器断开连接。但是套接字进程并不会死亡,只要它回答了{error, disconnected}。到目前为止,我写了泳池工人检查员,如果is_connected(Pid)不是真的,我们杀了工人和泳池创建新的。我每十分钟就解雇一次。但它没有帮助。它返回true,但然后我要求我得到{error, disconnected}。只有当工作人员返回{error, disconnected}时,目前工作的解决方案才能完全重新启动。这非常野蛮,可能会导致整个应用程序崩溃。

当我检查服务器日志,我发现有很多象这样的错误二:

2012-09-20 00:10:10.976 [error] <0.803.0>@riak_core_vnode:handle_info:510 29686752008283965526riak_kv_vnode worker pool crashed {timeout,{gen_server,call,[<0.819.0>,{work,<0.806.0>,{fold,#Fun<riak_kv_eleveldb_backend.3.96124638>,#Fun<riak_kv_vnode.14.47983300>},{raw,59205031,<0.28969.11>}}]}} 
2012-09-20 00:10:10.976 [error] <0.862.0>@riak_core_vnode:handle_info:510 365375409332725729550921208179070754913983135744 riak_kv_vnode worker pool crashed {timeout,{gen_fsm,sync_send_event,[<0.866.0>,{checkout,false,5000},5000]}} 

我想这是真正的问题,但我认为客户端连接应至少记录一些东西,得到连接问题故障列表或死亡。我得到了is_connected(Pid)= true

你是如何组织24/7连接的连接池?你如何检查泳池工作人员或刷新他们?

回答

0

保持您的连接池监督,并让连接死亡,如果他们得到{错误,断开连接}或其他错误。如果由于某种原因套接字进程出于某种原因无法继续使用,则可以手动停止套接字进程。我想用poolboy做这样的事情。