【问题标题】:"Random" SocketError/Connection Refused errors on py2neo queriespy2neo 查询中的“随机”SocketError/Connection Refused 错误
【发布时间】:2013-12-17 23:56:45
【问题描述】:

你好,希望这不会变得太琐碎。

我的堆栈的相关部分是 Gunicorn/Celery、neomodel (0.3.6) 和 py2neo (1.5)。 Neo4j 版本是 1.9.4,绑定在 0.0.0.0:7474 上(所有这些都在 linux 上,我认为是 Ubuntu 13.04)

所以我的 gunicorn/celery 服务器大部分时间都很好,除了偶尔,我收到以下错误:

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 ;))。

到目前为止,我所采取的步骤涉及修补 neomodel 连接函数以检查每个线程是否创建了 GraphDatabaseService 对象,并每隔 30 秒左右自动重新连接(和验证)到 neo4j 服务器.这可能降低了错误的频率,但它们仍然会发生。

在线查找错误,似乎大多数人试图连接到错误的接口/ip/端口。但是,鉴于我的大部分请求都通过了,我觉得这里不是这种情况。

有什么想法吗?我不认为这是相关的,但我的数据库似乎有 38k 孤立节点;这本身可能值得另一个问题。

编辑:我应该补充一点,当使用 workers=1 而不是 workers=$CPU_N 运行 gunicorn/celery 时,这似乎消失了。看不出它为什么重要,因为显然 neo4j 设置为默认处理 $N_CPU*10 连接。

【问题讨论】:

    标签: python neo4j py2neo neomodel


    【解决方案1】:

    这看起来像是网络或 Web 堆栈配置问题,所以我认为我无法从 py2neo 的角度提供帮助。我建议升级到 py2neo 1.6,因为客户端 HTTP 代码已经完全重写,它可能会更优雅地处理重新连接。

    【讨论】:

    • 是的,正如我所怀疑的那样,它修复了它(或者至少目前是这样)。另外,该死的将 Node.id 更改为 Node._id ;)
    • 那是因为节点ID一般不应该直接使用:-P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多