Я использую публикацию / подписку для проекта и хочу найти решение для проблемы, которую я предвижу в будущем.
Проблема, которую я вижу, состоит в том, что у нас будет много издателей, которых они будут обновление некоторых данных и приведет к опубликованию sh сообщения об обновлении (по указанному c топи c), будет много тем и много обновлений на каждую топи c (например, 1000 обновлений за 1 секунду в одной топи c и 2000 в другом), и я должен предотвратить это, поскольку я не хочу, чтобы мои подписчики получали тонны обновленного сообщения в секунду.
Мне просто важно иметь один обновлять каждую топи c каждые n секунд при появлении любого нового сообщения
Посмотрите на этот пример (n = 1 секунда):
[time: 0.00] *message (publish message as it is first message)
[time: 0.02] message (nop)
[time: 0.03] message (nop)
[time: 0.04] message (nop)
[time: 0.10] message (nop)
[time: 1.00] *(1 second after last publish) (publish message as as we had a message at 0.10)
[time: 1.22] message (nop)
[time: 2.00] *(1 second after last publish) (publish message as as we had a message at 1.22)
(NO UPDATE as no update from last publish)
[time: 5.50] message (publish message as it is first message in last second)
[time: 5.60] message (nop)
[time: 6.50] *(1 second after last publish) (publish message as as we had a message at 5.60)
Инфраструктура JAVA, у нас в распоряжении есть rabbitmq, appsyn c, aws сервировок.
На данный момент предлагаются следующие решения:
-
Использовать блокирующий поток для приостановки после первого сообщения и игнорирования следующего сообщения. s в той же самой topi c с тайм-аутом для запуска окончательного сообщения после n секунд и завершения его работы.
Сохранить временную метку сообщения для каждой topi c введите в кеш, игнорируйте новые сообщения, если ключ существует в кеше, запускайте кучу рабочих для обработки очереди и запускайте сообщения для сообщений старше n секунд и удаляйте сохраненный ключ из кеша.
Запустите первое сообщение и сохраните метку времени в кеше для topi c и не запускайте никаких сообщений после тех пор, пока новое сообщение меньше n секунды старый (в этом случае мы потеряем последнее сообщение)
У каждого решения есть свои плюсы и минусы, я ищу еще несколько мозгов, чтобы узнать, какие есть другие варианты, может быть, система очередей может помочь?