Привет!
На уровне сервиса хочу организовать дедупликацию входящих от брокера сообщений.
Вводные:
1. У сообщения есть уникальный ID
2. У сообщения есть дата отправки продюсером.
Задачи:
1. Отклонить сообщение, если ID уже зарегистрирован.
2. Отклонить сообщение, если его дата старее, чем последняя дата принятого сообщения (этим добиваемся исключения ошибок в очерёдности доставки).
Решения:
Табличка Mysql видится вроде бы достаточно простой:
| ID | Date | Message data |
Первая задача решается просто из природы primary key во время операции INSERT.
Как решить вторую, чтобы избежать race condition? Я так понимаю, без каких-то локов тут не обойтись? В идеале хотелось бы видеть какую то атомарную операцию "вставил новую строку или отклонил". Смотрел на вариант
INSERT...SELECT, но я так понимаю, между селектом и вставкой может вклиниться другая операция вставки и всё пойдёт насмарку.