Sobes.tech
Junior

Architektonická úloha: existuje služba Používatelia a služba Notifikácie. Pri registrácii používateľa je potrebné garantovať odoslanie správy do Kafka (pre odoslanie emailu). Ako zabezpečiť záruku doručenia, ak Kafka nie je dostupná?

sobes.tech AI

Odpoveď od AI

Чтобы гарантировать доставку сообщения в Kafka при регистрации пользователя, даже если Kafka временно недоступна, можно использовать паттерн Outbox:

  1. При регистрации пользователя в сервисе Users сохранять данные пользователя и сообщение для Kafka в одной транзакции базы данных (например, в таблице outbox).
  2. Отдельный процесс или воркер периодически читает из таблицы outbox неподтверждённые сообщения и пытается отправить их в Kafka.
  3. После успешной отправки сообщение помечается как отправленное.

Таким образом, даже если Kafka недоступна в момент регистрации, сообщение не потеряется и будет отправлено позже.

Пример упрощённой схемы:

// В транзакции
saveUser(user);
saveOutboxMessage(userId, "UserRegistered");

// Отдельный процесс
List<Message> messages = readUnsentOutboxMessages();
for (Message msg : messages) {
    try {
        kafkaProducer.send(msg);
        markMessageAsSent(msg);
    } catch (Exception e) {
        // логируем и повторим позже
    }
}

Это обеспечивает надёжность и согласованность между сервисом и Kafka.