"Случайный" SocketError/Connection Отказано в ошибках в запросах py2neo

Привет, надеюсь, это не будет слишком тривиально.

Соответствующие части моего стека - 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 (Первый вызов в ответе на запрос), и получаю ошибку сокета. Иногда. Большую часть времени он подключается нормально. Ошибка возникает среди всех представлений Flask / Celery, которые используют соединение neo4j (а не просто User.index.get;)).

Пока что шаги, которые я предпринял, включали монетское исправление функции соединения neomodel, чтобы проверить, что GraphDatabaseService Объект создается для каждого потока и автоматически переподключается (и аутентифицируется) к серверу neo4j каждые 30 секунд или около того. Это могло уменьшить частоту ошибок, но они все еще происходят.

Ища ошибку онлайн, кажется, что в основном люди пытаются подключиться к неправильному интерфейсу /ip/port. Однако, учитывая, что большинство моих запросов проходят, я не чувствую, что это так.

Есть идеи? Я не думаю, что это связано, но моя база данных, похоже, содержит 38 тысяч потерянных узлов; это, вероятно, заслуживает другого вопроса сам по себе.

РЕДАКТИРОВАТЬ: я должен добавить, это, кажется, исчезает при запуске gunicorn / сельдерея с workers=1, вместо workers=$CPU_N, Не могу понять, почему это должно иметь значение, так как, очевидно, neo4j настроен на обработку $N_CPU*10 соединения по умолчанию.

1 ответ

Решение

Это похоже на проблему конфигурации сети или сетевого стека, поэтому я не думаю, что смогу помочь с точки зрения py2neo. Я бы порекомендовал обновить его до py2neo 1.6, поскольку HTTP-код клиента полностью переписан, и он может обрабатывать переподключение более изящно.

Другие вопросы по тегам