Как гарантировать доставку сообщений с помощью Celery?

У меня есть приложение на Python, в котором я хочу начать выполнять больше работы в фоновом режиме, чтобы оно лучше масштабировалось по мере увеличения загруженности. Раньше я использовал Celery для выполнения обычных фоновых задач, и это хорошо работало.

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

В этом приложении меня не слишком заботит скорость очереди сообщений, мне в первую очередь нужны надежность и долговечность. На всякий случай я хочу иметь два сервера очереди, оба в разных центрах обработки данных на случай, если что-то пойдет не так, один резервный для другого.

Глядя на Celery, похоже, что он поддерживает кучу разных бэкэндов, некоторые с большим количеством функций затем другие. Два самых популярных выглядят как redis и RabbitMQ, поэтому мне потребовалось время, чтобы изучить их дальше.

RabbitMQ: Поддерживает устойчивые очереди и кластеризацию, но проблема сегодняшней кластеризации заключается в том, что если вы потеряете узел в кластере, все сообщения в этом узле будут недоступны, пока вы не вернете этот узел в оперативный режим. Он не реплицирует сообщения между различными узлами в кластере, он просто реплицирует метаданные о сообщении, а затем возвращается к исходному узлу, чтобы получить сообщение, если узел не запущен, вы являетесь S.O.L. Не идеально.

Чтобы обойти это, они рекомендуют настроить второй сервер и реплицировать файловую систему с помощью DRBD, а затем запустить что-то вроде кардиостимулятора, чтобы переключить клиентов на резервный сервер, когда это тоже необходимо. Это кажется довольно сложным, не уверен, что есть способ лучше. Кто-нибудь знает способ лучше?

Redis: Поддерживает чтение ведомого, и это позволило бы мне иметь резервную копию в случае чрезвычайных ситуаций, но он не поддерживает настройку ведущего-ведущего, и я не уверен, обрабатывает ли он активное переключение при отказе между ведущим и ведомым. Он не имеет тех же функций, что RabbitMQ, но выглядит намного проще в настройке и обслуживании.

Вопросы:

  1. Как лучше всего настроить сельдерей так что это будет гарантировать сообщение обработка.

  2. Кто-нибудь делал это раньше? Если так, не могли бы вы поделиться тем, что вы сделали?

34
задан Ken Cochrane 5 July 2011 в 01:14
поделиться