Riak连接池无声断开连接

时间:2012-10-05 13:52:17

标签: erlang database-connection riak

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

几天后,riak服务器断开了我们的连接。但套接字进程不会死,在任何请求它回答{error, disconnected}。到目前为止,我编写了池工作检查程序,如果它is_connected(Pid)返回不正确,我们会杀死worker和pool创建新的。我每十分钟开一次。但它没有帮助。它返回true,但后来我发出请求{error, disconnected}。如果某个工作人员返回{error, disconnected},那么到目前为止只能使用池完全重新启动的解决方案。这是非常野蛮的,可能会崩溃整个应用程序。

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

2012-09-20 00:10:10.976 [error] <0.803.0>@riak_core_vnode:handle_info:510 296867520082839655260123481645494988367611297792 riak_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

您如何组织全天候工作的连接池?您如何检查池工作者或刷新它们?

1 个答案:

答案 0 :(得分:0)

保持您的连接池受到监督,如果他们遇到{错误,已断开连接}或其他错误,则让连接死亡。如果出于某种原因套接字进程由于某种原因没有随之降低,你也可以手动停止它。

至于我,我使用poolboy做这样的事情。