Есть набор микросервисов(отправители), которые отсылают сообщение с айди об обработке данных(предположительно в какую-ту очередь), есть другой набор микросервисов(получатели), которые должны принимать эти сообщение и обрабатывать данные, но есть некоторые ограничения. Получатели должны обрабатывать айди, которое находится в очереди как минимум 10 минут, а отправители могут отправлять сообщения с одинаковыми айди, причем 10 минут должны отсчитываться от последнего сообщения с таким айди
Рассматривал вариант с кафкой, но как сделать задержку 10 минут и как не обрабатывать старые сообщения не понятно
Есть вариант с редисом, но эта очередь может стать очень большой и не влезет в оперативную память
Был вариант с постгресом(или иной) и блокировкой таблицы, но при нагрузках блокировки плохо скажутся на производительности
Думаю, при получении сообщений необходимо сохранить в СУБД тело сообщения, id (UUID?), timestamp. При наличии существующего id просто обновить timestamp.
Некоторый сервис может с частотой 1 Гц проверять наличие записей, у которых timestamp подпадает под условие "которое находится в очереди как минимум 10 минут" и всех их отправлять в брокер сообщений и удалять/помечать как удалённые.
Таким образом, обработчики очереди берут из очереди только сообщения, для которых пришло время обработки.
Если темп отправки брокеру сообщений умеренный, нет смысла использовать Kafka. Возможно, достаточно и RabbitMQ. Главное, чтобы очередь не росла и обработчики успевали опустошать её.