Что происходит с сообщениями в очереди при перезапуске брокера и какая технология это поддерживает
Что проверяют
Понимаете ли вы, что сохранность сообщений это не свойство брокера, а результат настроек на трёх участках сразу: у издателя, у брокера, у потребителя. Тестировщика спрашивают, сможет ли он проверить надёжность руками, а не пересказать список возможностей из описания продукта.
Как отвечать
Общий принцип один: перезапуск переживёт только то, что успело лечь на диск и получить подтверждение. Дальше по конкретике.
В RabbitMQ должны совпасть три условия: очередь объявлена долговечной, сообщение отправлено как постоянное, издатель дождался подтверждения. Постоянное сообщение в недолговечной очереди исчезнет вместе с очередью. Неподтверждённые потребителем сообщения после восстановления выдаются заново с признаком повторной доставки. Кворумные очереди держат ещё и потерю узла, а не только перезапуск.
В Kafka журнал и так на диске, поэтому вопрос переходит в репликацию: фактор репликации больше единицы, подтверждение от всех синхронных реплик, минимальное число таких реплик тоже больше единицы. Тогда перезапуск одного брокера означает смену лидера партиции, а потребители продолжают с зафиксированных оффсетов.
Проверять это стоит так: гасить брокер грубо, а не командой корректного завершения, и сверять счётчики отправленного и полученного, дубликаты, порядок. Отдельный сценарий: издатель отправил и не дождался подтверждения, что он делает дальше.
Где спотыкаются
Считают, что достаточно слова «долговечная» в описании очереди. Без постоянных сообщений и подтверждений издателя это половина цепочки, и потеря случается ровно на второй половине.
Проверяют только корректный перезапуск. Настоящая авария это убитый процесс или пропавшее питание, и там теряется всё, что лежало в кэше операционной системы и не было сброшено на диск.
Заводят дефект на дубликат после восстановления. Повторная доставка неподтверждённого сообщения штатна почти везде, и писать дефект надо не на неё, а на неидемпотентный обработчик, который от повтора списывает деньги дважды.