Если несколько реплик воркера могут отправить одно outbox-сообщение в Kafka 4–5 раз, как обеспечить ровно одну отправку?

Метод, гарантирующий, что сообщение будет обработано не более одного раза, называется exactly-once processing.

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Основной принцип:

  • Каждое сообщение получает уникальный идентификатор (ID).
  • При обработке сообщения система проверяет, обрабатывалось ли оно ранее, например, по сохранённому ID в базе или кэше.
  • Если сообщение уже обработано, повторная обработка пропускается.
  • Если нет — сообщение обрабатывается, и результат сохраняется.

В Go это можно реализовать, например, так:

var processedMessages = make(map[string]bool)

func processMessage(msgID string, payload []byte) {
    if processedMessages[msgID] {
        fmt.Println("Сообщение уже обработано, пропускаем")
        return
    }
    // Обработка сообщения
    fmt.Println("Обрабатываем сообщение", msgID)
    // ... логика обработки ...

    processedMessages[msgID] = true
}

В реальных системах для хранения состояния обычно используют внешние хранилища (БД, Redis), чтобы избежать потери данных при перезапуске.

Также важна идемпотентность операций — повторная обработка одного и того же сообщения не должна приводить к нежелательным побочным эффектам.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку