0

我在生产中遇到了严重的问题。我们使用官方 erlang pb 客户端制作连接池。一切正常。为了组织游泳池,我们使用热水浴缸(我们尝试了几个,但这是最简单的)。每个连接至少在 3-5 分钟内使用一次(现在生产未满载)。

几天后 riak 服务器断开了我们的连接。但是套接字进程不会死,它会响应任何请求{error, disconnected}。到目前为止,我编写了池工作者检查器,如果它is_connected(Pid)返回不正确,我们将杀死工作者并池创建新的。我每十分钟发射一次。但这没有帮助。它返回 true,但随后我提出了我得到的请求{error, disconnected}。到目前为止,唯一有效的解决方案是 pool full reinit if some worker return {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

您如何组织 24/7 全天候工作的连接池?您如何检查池工作人员或刷新他们?

4

1 回答 1

0

保持您的连接池受到监督,如果连接出现 {error, disconnected} 或出现其他问题,则让连接终止。如果由于某种原因套接字进程由于某种原因没有停止,您也可以手动停止它。

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

于 2012-11-01T02:39:35.013 回答