Найти - Пользователи
Полная версия: Архитектура приложения. Отказоустойчивость.
Начало » Python для новичков » Архитектура приложения. Отказоустойчивость.
1 2 3
Budulianin
Есть WSGI приложение. Запускается в uWSGI. Приложение построено так, что если worker uWSGI “погибнет” в определённом месте(например от нагрузки), то не выполнит запрос доконца и не успеет убрать значение из БД, что в дальнейшем нарушит работу всему приложению(пока значение не уберёшь из БД).

Что думаете? Это критическая архитектурная ошибка, которая снижает отказоустойчивость?
Или просто нужно стремиться, чтобы workerы не “падали”, а такая особенность приложения вполне приемлема в реальности?
s0rg
Budulianin
Это критическая архитектурная ошибка, которая снижает отказоустойчивость?
this

Что будет если клиент начнет запрос, но отвалится/отсоединится?
Budulianin
s0rg
this
?
s0rg
Что будет если клиент начнет запрос, но отвалится/отсоединится?
Я думаю что ничего, ведь запрос отработает до конца, просто отдать его будет некому.

На данный момент, я думаю, что в приложение должны закладывать такой случай, что воркер может упасть, соответственно нужно писать так, чтобы это невлияло на приложение в целом.
s0rg
Budulianin
?
Указание, что по моему мнению, именно этот вариан правильный )

Budulianin
воркер может упасть
У вас воркеры не перезапускаются?
Uwsgi не может упасть? (у меня ни разу не падал, но все же)
И не факт, что воркер будет отрабатывать до конца, в случае отвалившегося клиента.
Для критичных данных есть очереди, отдавайте задачу, о записи важных для вас данных
в очередь (RabbitMQ например) - это надежней, чем надеятся, что цепочка клиент-веб-сервер-uwsgi-ваш код будет всегда отрабатывать как Вы предполагаете. Но это мое мнение )
Budulianin
s0rg
У вас воркеры не перезапускаются?
Перезапускаются, но это никак не влияет, потому что воркер умер в неподходящий момент :) и оставил в БД, то что должен был убрать.

s0rg
Uwsgi не может упасть?
Может, у него даже настройки есть на этот случай, убивать воркеров, если главный процесс умер.

s0rg
И не факт, что воркер будет отрабатывать до конца, в случае отвалившегося клиента.
Как проверить правильно? Чем сделать запрос, чтобы его оборвать в нужный момент?
Убивать процесс сигналом, пока он ждёт ответ? Наверно это плохой вариант.

s0rg
Для критичных данных есть очереди, отдавайте задачу, о записи важных для вас данных
Не знаю подойдёт такой вариант или нет, надо подумать.

s0rg
Но это мое мнение )
Его я и хотел получить.
s0rg
Budulianin
Как проверить правильно? Чем сделать запрос, чтобы его оборвать в нужный момент?
Вставить sleep в интерисующий обработчик?

Budulianin
Может, у него даже настройки есть на этот случай, убивать воркеров, если главный процесс умер.
Есть - посмотрите в сторону emperor, если я правильно понял идею.
Budulianin
s0rg
Вставить sleep в интерисующий обработчик?
Пока он спит, убить процесс, который сделал запрос?

s0rg
Есть - посмотрите в сторону emperor, если я правильно понял идею.
Это не идея:), просто сказал про возможности uWSGI.

s0rg
Budulianin
Пока он спит, убить процесс, который сделал запрос?
Да, именно.
Ксати а на чем само приложение? flask?
Budulianin
s0rg
Да, именно.
Спасибо за ответы.

s0rg
flask?
only Pyramid :)
s0rg
Budulianin
only Pyramid
За него не скажу, но у flask есть специальный обработчик всех ошибок, типа финализатор запроса, возможно, что-то подобное есть и в пирамиде.
Наверно это будет самое простое решение - разместить код ‘прибирающий’ в бд именно в таком обработчике )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB