Почему выбрано RabbitMQ с точки зрения надежности
Что проверяют
Отличаете ли вы гарантии, которые брокер даёт сам, от тех, что строит приложение. Вопрос быстро уходит в детали: подтверждения публикации, долговечность, ручной ack, поведение при сбое потребителя и идемпотентность обработки.
Как отвечать
Надёжность тут не свойство продукта, а цепочка звеньев, и каждое нужно назвать своими словами:
- подтверждения публикации на стороне отправителя, иначе публикация просто пишет в сокет и возвращает управление, а брокер мог сообщение и не принять;
- долговечная очередь плюс persistent-сообщение, иначе перезапуск брокера стирает всё, что в ней лежало;
- ручное подтверждение после успешной обработки и ограничение выдачи через prefetch: при обрыве соединения неподтверждённое сообщение возвращается в очередь другому потребителю;
- отказ без возврата в очередь плюс dead letter exchange для ядовитых сообщений, а повтор с задержкой собирается из отдельной очереди с TTL, потому что встроенной политики ретраев в брокере нет;
- кворумные очереди, если надо пережить падение узла кластера.
Отсюда главный вывод, который и хотят услышать: гарантия получается «не менее одного раза». После сбоя между обработкой и подтверждением сообщение придёт снова, поэтому потребитель обязан быть идемпотентным: ключ идемпотентности, уникальный индекс в базе, вставка с обновлением.
Из питонической части уместно упомянуть, что соединение не делится между потоками, а долгая обработка без сердцебиения роняет канал.
Где спотыкаются
Отвечают «очередь, значит ничего не потеряется», не назвав ни долговечности, ни подтверждений. После перезапуска брокера такая система теряет всё разом.
Путают prefetch с приоритетами. Первое ограничивает число неподтверждённых сообщений у потребителя, второе отдельная настройка очереди и к сохранности данных отношения не имеет.
Включают автоподтверждение ради скорости: сообщение считается доставленным до обработки, и падение воркера теряет его безвозвратно. Рядом обычно забывают про идемпотентность и получают дубли при первом же переподключении.