У меня есть приложение на Python, в котором я хочу начать больше работать в фоновом режиме, чтобы оно лучше масштабировалось по мере увеличения загруженности. Раньше я использовал Celery для выполнения обычных фоновых задач, и это хорошо работало.
Единственная разница между этим приложением и другими, которые я делал в прошлом, заключается в том, что мне нужно гарантировать, что эти сообщения будут обработаны, и они не могут быть потеряны.
В этом приложении меня не слишком заботит скорость очереди сообщений, мне в первую очередь нужны надежность и долговечность. На всякий случай я хочу иметь два сервера очереди, оба в разных центрах обработки данных, на случай, если что-то пойдет не так, один резервный для другого.
Глядя на Celery, похоже, что он поддерживает множество различных бэкэндов, некоторые из которых имеют больше функций, чем другие. Два самых популярных выглядят как redis и RabbitMQ, поэтому мне потребовалось время, чтобы изучить их подробнее.
RabbitMQ: поддерживает устойчивые очереди и кластеризацию, но проблема нынешней кластеризации заключается в том, что если вы потеряете узел в кластере, все сообщения в этом узле будут недоступны, пока вы не вернете этот узел в оперативный режим. . Он не реплицирует сообщения между различными узлами в кластере, он просто реплицирует метаданные о сообщении, а затем возвращается к исходному узлу, чтобы получить сообщение, если узел не запущен, вы являетесь S.O.L. Не идеально.
Чтобы обойти это, они рекомендуют настроить второй сервер и реплицировать файловую систему с помощью DRBD, а затем запустить что-то вроде кардиостимулятора, чтобы переключить клиентов на резервный сервер, когда это тоже необходимо. Это кажется довольно сложным, не уверен, что есть способ лучше. Кто-нибудь знает способ лучше?
Redis: поддерживает чтение ведомого устройства, и это позволило бы мне создать резервную копию на случай чрезвычайных ситуаций, но он не поддерживает настройку мастер-мастер, и я не уверен, обрабатывает ли он активное аварийное переключение между мастером. и раб. Он не имеет тех же функций, что и RabbitMQ, но выглядит намного проще в настройке и обслуживании.
Вопросы:
Как лучше всего настроить сельдерей, чтобы он гарантировал обработку сообщений.
Кто-нибудь делал это раньше? Если да, не могли бы вы поделиться тем, что вы сделали?