Junior
Architektonický úkol: existuje služba Uživatelé a služba Notifikace. Při registraci uživatele je nutné garantovat odeslání zprávy do Kafka (pro odeslání emailu). Jak zajistit záruku doručení, pokud Kafka není dostupná?
sobes.tech AI
Odpověď od AI
Чтобы гарантировать доставку сообщения в Kafka при регистрации пользователя, даже если Kafka временно недоступна, можно использовать паттерн Outbox:
- При регистрации пользователя в сервисе Users сохранять данные пользователя и сообщение для Kafka в одной транзакции базы данных (например, в таблице outbox).
- Отдельный процесс или воркер периодически читает из таблицы outbox неподтверждённые сообщения и пытается отправить их в Kafka.
- После успешной отправки сообщение помечается как отправленное.
Таким образом, даже если Kafka недоступна в момент регистрации, сообщение не потеряется и будет отправлено позже.
Пример упрощённой схемы:
// В транзакции
saveUser(user);
saveOutboxMessage(userId, "UserRegistered");
// Отдельный процесс
List<Message> messages = readUnsentOutboxMessages();
for (Message msg : messages) {
try {
kafkaProducer.send(msg);
markMessageAsSent(msg);
} catch (Exception e) {
// логируем и повторим позже
}
}
Это обеспечивает надёжность и согласованность между сервисом и Kafka.