Hullo,希望这不会变得太微不足道。
我的堆栈的相关部分是Gunicorn / Celery,neomodel(0.3.6)和py2neo(1.5)。 Neo4j版本是1.9.4,绑定在0.0.0.0:7474(所有这些都在linux上,我认为是Ubuntu 13.04)
所以我的gunicorn /芹菜服务器大部分时间都很好,除了偶尔,我收到以下错误:
ConnectionRefusedError(111, 'Connection refused')
Stacktrace (most recent call last):
File "flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "flask/_compat.py", line 33, in reraise
raise value
File "flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "Noomsa/web/core/util.py", line 156, in inner
user = UserMixin().get_logged_in()
File "Noomsa/web/core/util.py", line 117, in get_logged_in
user = models.User.index.get(username=flask.session["user"])
File "neomodel/index.py", line 50, in get
nodes = self.search(query=query, **kwargs)
File "neomodel/index.py", line 41, in search
return [self.node_class.inflate(n) for n in self._execute(str(query))]
File "neomodel/index.py", line 28, in _execute
return self.__index__.query(query)
File "py2neo/neo4j.py", line 2044, in query
self.__uri__, quote(query, "")
File "py2neo/rest.py", line 430, in _send
raise SocketError(err)
因此,正如您所看到的,我调用User.index.get
(请求响应中的第一个调用),并获得套接字错误。有时。大多数时候,它连接得很好。在使用neo4j连接的所有Flask视图/ Celery任务中发生错误(而不只是执行User.index.get
;))。
到目前为止,我采取的步骤涉及moneky修补neomodel连接函数以检查每个线程是否创建了GraphDatabaseService
对象,并且每隔30或者自动重新连接(和验证)到neo4j服务器或者所以秒。这可能会减少错误的频率,但它们仍然会发生。
在网上寻找错误,似乎主要是人们试图连接到错误的接口/ IP /端口。但是,鉴于我的大部分要求都经过,我觉得这不是这种情况。
有什么想法吗?我不认为这是相关的,但我的数据库似乎有38k孤立的节点;这本身可能值得另外一个问题。
编辑:我应该补充一点,当使用workers=1
而不是workers=$CPU_N
运行gunicorn /芹菜时,这似乎消失了。无法理解它为什么重要,因为显然neo4j设置为默认处理$N_CPU*10
连接。
答案 0 :(得分:1)
这看起来像是网络或Web堆栈配置问题所以我认为我无法从py2neo的角度提供帮助。我建议升级到py2neo 1.6,因为客户端HTTP代码已被完全重写,它可能会更优雅地处理重新连接。