Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
RabbitMQ хорошо работает когда вам нужно выполнять таски на нескольких серверах. В пределах одного сервера Rabbit представляет из себя суровую пушку стреляющую по воробьям, для этого лучше подходит, например, 0MQ.
На клиент сайде так же можно сделать обвязку поверх транспортного уровня, чтобы не писать напрямую в вебсокет (socket.io или sockjs).
В идее с wsgi есть проблема, по крайней мере если вы рассматриваете торнадо как фронтенд и воркеры как бэкенд обработки. Воркеры работают с чистыми данными, им не нужен request и заголовки, сессии и прочее, с этим должен работать торнадо. Уровень wsgi здесь кажется лишним, так как сразу напрямую можно использовать объекты бизнес-логики без каких-либо дополнительных прослоек.
AMQP толст — если размер Payload'a будет меньше размера Header'аЛюбая распределенная система (я говорю не об одной ноде с RabbitMQ а о кластере хотя-бы из двух трех нод) это overhead на пересылку пакетов по сети сериализацию/десериализацию. Хотите «тонкий» протокол общения ок, используйте 0MQ (кладите все в «shared memory» наконец), хотите работать на 10 виртуалках в облаке, планируйте жизнь с неким overhead.
Масштабировать вертикально с помощью AMQP в рамках одной ноды — ересь!Именно поэтому слово «распределенный» и является ключевым. В статье нет ни слова о вертикальном масштабировании, crew это именно про горизонтальное масштабирование.
Хотите строить «распределённые» сервисы — проводите нагрузочное тестирование jMeter'ом и Яндекс.танком и профилируйте до потери пульса!Согласен, сурового highload добиться можно только так. Сейчас речь идет скорее о надежности (непроизвольный отвал нескольких нод и тому подобные жизненные реалии). Сейчас версия модуля 0.7.0, у меня он покрывает все кейсы, работает и все суровые баги я уже почистил, сейчас начинаю всестороннее тестирование. Если вам интересен проект, давайте проведем нагрузочные или интеграционные тесты, помогите проекту.
Когда eigrad предложил написать прослойку, которой можно запустить любое wsgi приложение с помощью crew, мне эта идея сразу понравилась. Только представьте, запросы хлынут не на ваше wsgi приложение, а будут равномерно поступать через очередь на wsgi-worker.
graceful restart
версионность кода
логирование (должно быть централизовано или централизуемо)
Опять же на совести разработчика. Worker это просто функция, лично у меня есть декоратор который шлет в sentry ошибки.
Этот вопрос я бы на вашем месте расписал подробнее. Что понимается под версионностью кода.
С распределением нагрузки по серверам не так уж и плохо справляется nginxДа только вот если к вам придет 10к запросов, nginx сразу их пошлет на backend. И тут уж вашему приложению придется самому справляться с нагрузкой. В данном же случае, у вас все ляжет в очередь, и workerы потихоничку и без напряга все отработают.
В данном же случае, у вас все ляжет в очередь, и workerы потихоничку и без напряга все отработают.
Я про версии кода приложения. Без проблем называете несовместимый по запросу/ответу таск «app.mysupertask.v1» и фронтенд с уже обновленным кодом все будет слать на новые воркеры. Даже если вы остановите все воркеры, у вас приходящие сообщения будут копиться в очереди (учитывая timeout который вы уже обработаете сами), а после запуска воркеров, все побежит.
Как просто написать распределенный веб-сервис на Python + AMQP