Распределенная очередь задержки в стиле SQS, но вне AWS? - PullRequest
0 голосов
/ 06 ноября 2018

Я ищу распределенную систему очередей, которая поддерживает отложенную доставку сообщений, т. Е. Потребители получат сообщение только после указанной задержки с момента, когда производитель отправил его. SQS - это система, с которой я больше всего знаком (особенно функция тайм-аут видимости ), но я нахожусь в среде, где AWS отключен.

Я вижу несколько вариантов прямо сейчас, но ни один из них не очень аппетитный:

  • Я менее знаком с RabbitMQ и его функцией TTL , но если придет толчок из-за этого я мог бы выкарабкаться из этого.
  • Существует возможность использования планировщика заданий вместо очереди сообщений, но это выглядит как довольно серьезное несоответствие импеданса для моей ситуации.
  • Я мог бы использовать подход база данных как очередь, но есть множество причин, по которым я не хочу этого делать.

Итак, мой вопрос заключается в следующем: существует ли система очередей, которая поддерживает отложенную доставку из коробки без необходимости накладывать кучу прикладной логики сверху, чтобы она работала?

1 Ответ

0 голосов
/ 06 ноября 2018

В последних версиях Kafka по умолчанию имеется отметка времени для каждого сообщения, и вы можете использовать ее для создания искусственно задержанного потока.

Просто создайте KafkaConsumer и в цикле опроса убедитесь, что отметка времени не старше n секунд. Если это так, сделайте паузу в цикле на несколько секунд (я использовал довольно эффективно 5 секунд, но даже для одной темы будет работать очень много), и продолжайте обработку в обычном режиме. Это будет эффективно приостанавливать работу потребителя до тех пор, пока следующая обрабатываемая запись не будет «готова» (то есть достаточно старая), и он будет сам дросселировать, всегда удерживая его на n секундах от реального времени.

Больше информации от Javadoc на KafkaConsumer:

https://kafka.apache.org/20/javadoc/org/apache/kafka/clients/consumer/ConsumerRecord.html#timestamp--

...