Обработка AutoConconnect Pymongo в приложении mongoengine (Django) - PullRequest
2 голосов
/ 01 февраля 2012

mongoengine 0.4, django 1.3.1, uwsgi 1.0.2.1

На этом я бился головой о стену.У меня есть приложение Django, которое использует mongoengine.Сервер mongodb отличается от моего сервера приложений, и определенная вещь (изменение правил брандмауэра и т. Д.) Приведет к потере соединения.

Я бы хотел реализовать обработку автоматического переподключения в этом случае, поэтомучто все мое приложение не падает, когда / если это произойдет.Я пытался что-то вроде этого: http://pastebin.com/HE8LSp5v (обратите внимание, что это не мой код, хотя я пытался изменить его, чтобы он работал безуспешно)

Код в этом пастбине успешно обнаружит ошибку ипопытайтесь восстановить соединение, но цикл for обычно не повторяется более одного раза, так что вы видите количество попыток повторного подключения каждую секунду, одну для каждого потока uwsgi, я предполагаю.

Поэтому я изменилнемного код (чтобы быть https://gist.github.com/1723790) и бросил его внизу моего файла settings.py. Результат одинаков для uwsgi и сервера dev, поэтому я буду использовать здесь сервер dev для простоты.

Запуская dev-сервер, я получаю:

SETTING OVERRIDES
SETTING OVERRIDES DONE
WRAPPER ENTRY
WRAPPER ENTRY
SETTING OVERRIDES
SETTING OVERRIDES DONE
SETTING OVERRIDES
SETTING OVERRIDES DONE
WRAPPER ENTRY
WRAPPER ENTRY
SETTING OVERRIDES
SETTING OVERRIDES DONE
Validating models...

0 errors found
Django version 1.3.1, using settings 'mucs.settings'
Development server is running at http://0.0.0.0:80/
Quit the server with CONTROL-C.

Когда запущен mongoengine, я захожу на страницу, которая выполняет несколько запросов. Работает нормально. Затем я выключаю mongodb и обновляю страницу.Я получаю что-то вроде этого на экране:

(REQUEST IS STARTED)
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
PyMongo auto-reconnecting... could not connect to mucs-content:27017: [Errno 111] Connection refused. Waiting 0.5 seconds. (Attempt 0)
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
PyMongo auto-reconnecting... could not connect to mucs-content:27017: [Errno 111] Connection refused. Waiting 0.5 seconds. (Attempt 0)
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
PyMongo auto-reconnecting... could not connect to mucs-content:27017: [Errno 111] Connection refused. Waiting 0.5 seconds. (Attempt 0)
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
PyMongo auto-reconnecting... could not connect to mucs-content:27017: [Errno 111] Connection refused. Waiting 0.5 seconds. (Attempt 0)
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
PyMongo auto-reconnecting... could not connect to mucs-content:27017: [Errno 111] Connection refused. Waiting 0.5 seconds. (Attempt 0)
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
WRAPPER ENTRY
PyMongo auto-reconnecting... could not connect to mucs-content:27017: [Errno 111] Connection refused. Waiting 0.5 seconds. (Attempt 0)
WRAPPER ENTRY

[...]

Так будет продолжаться до тех пор, пока я не перезапущу mongodb, и в этот момент страница отображается правильно и все работает нормально.Я не хочу внедрять этот код в производство, потому что я точно не знаю, что здесь происходит.Похоже, что он может повторяться в цикле и не вытягивать исключение AutoReconnect, которое происходит обратно правильно.Я думаю, что следующая вещь, которую можно попробовать, это проверить стек каждой операции, чтобы точно увидеть, что происходит.

...