当通过loadbalancer暴露neo4j db时,在py2neo中获得“ TimeoutError:[Errno 110]连接超时”

问题描述

我已经在k8s中部署了neo4j社区版(版本4.0.0),并且已经通过nginx-ingress负载均衡器公开(螺栓和浏览器)。

现在,当尝试使用py2neo(最新版本)连接到该数据库时,它的工作正常。但是在闲置20或25分钟后,我收到了异常消息:损坏

请注意,AWS负载均衡器中的空闲超时时间已更改为3600s,并且对于Nginx入口也是如此。

exeption message: broken.

完整日志:

Traceback (most recent call last):
  File "/tmp/test/py2neo/wiring.py",line 270,in send
    n = self.__socket.send(self.__output)
TimeoutError: [Errno 110] Connection timed out
During handling of the above exception,another exception occurred:
in query
    return self.graph.run(query).data()
  File "/tmp/test/py2neo/database.py",line 579,in run
    return self.auto().run(cypher,parameters,**kwparameters)
  File "/tmp/test/py2neo/database.py",line 918,in run
    result = self._connector.auto_run(self.graph.name,cypher,hydrant)
  File "/tmp/test/py2neo/client/__init__.py",line 996,in auto_run
    cx.sync(result)
  File "/tmp/tes/py2neo/client/bolt.py",line 318,in sync
    self._send()
  File "/tmp/test/py2neo/client/bolt.py",line 354,in _send
    sent = self._writer.send()
  File "/tmp/test/py2neo/client/packstream.py",line 652,in send
    return self._tx.send()
  File "/tmp/test/py2neo/wiring.py",line 273,in send
    raise WireError("broken")
py2neo.wiring.WireError: broken

交通流是这样的:

py2neo client ---> botl address(record in route53 against loadbalancer) ---> loadbalancer ---> nginx-ingress--->neo4j service---> neo4j docker container(standalone)

有人可以帮我解决这个问题吗?

解决方法

您对这里的期望是什么?因为py2neo不包含任何对付恶意网络环境的功能,在恶意网络环境中,第三方网络组件一时兴起意外地关闭了连接。

此外,我不了解您的整体拓扑。您说您正在使用Community Edition,因此您无法运行群集,但提到了负载平衡器。您要在哪些服务器上进行负载平衡? Community Edition只能运行单个实例。还有,为什么还要把nginx也放在那里?

对我来说,您已经回答了自己的问题。您已插入会使连接超时的网络组件,而py2neo恰恰报告了这一情况。如果您想在此类连接失败后恢复,则需要构建客户端代码以检测到此情况并重试。

如果您使用的是临时集群(以及企业版),则建议使用官方的Python驱动程序。但我不确定在这种情况下是否会对您有帮助。