Обычный способ реализации шаблона исходящих сообщений состоит в том, чтобы сохранить полезную нагрузку сообщения в таблице исходящих сообщений и иметь отдельный процесс ( Message Relay ) для ожидающих сообщений и публиковать их. в брокер сообщений, Кафка в моем случае.
Состояние исходящей таблицы может быть таким, как показано ниже.
OUTBOX TABLE
---------------------------------
|ID | STATE | TOPIC | PAYLOAD |
---------------------------------
| 1 | PROCESSED | user |
| 2 | PENDING | user |
| 3 | PENDING | billing |
----------------------------------
My Message Relay - это приложение Spring Boot / Cloud Stream, которое периодически (@Scheduled
) ищет записи PENDING, публикует их в Kafka и обновляет запись в состоянии PROCESSED.
Первая проблема - : если я запускаю несколько экземпляров ретрансляции сообщений, все они будут запрашивать таблицу исходящих, и, возможно, в какой-то момент разные экземпляры получат одни и те же реестры PENDING для публикации в Kafka, генерация дублированных сообщений. Как я могу предотвратить это?
Другая ситуация : предполагается, что только один ретранслятор сообщений. Он получает одну запись в ожидании, публикует ее в теме, но вылетает, прежде чем обновить запись до ОБРАБОТАНО. Когда он снова запустится, он найдет ту же запись PENDING и снова опубликует ее. Есть ли способ избежать этого дублирования или единственный способ - разработать идемпотентную систему.