代码之家  ›  专栏  ›  技术社区  ›  Seth

SQS型分布式延迟队列,但在AWS之外?

  •  0
  • Seth  · 技术社区  · 6 年前

    我正在寻找一个支持延迟消息传递的分布式排队系统,也就是说,当生产者发送消息时,消费者只有在指定的延迟之后才能收到消息。 SQS 是我最熟悉的系统吗(尤其是 visibility timeout 但我所处的环境是AWS是禁止的。

    我现在看到了一些选择,但没有一个是非常开胃的:

    • 我不太熟悉 RabbitMQ 以及 TTL feature ,但如果有压力 我也许可以凑合一下。
    • 有可能使用作业调度程序而不是消息队列,但对于我的情况,这似乎是一个非常糟糕的阻抗不匹配。
    • 我可以将数据库作为队列方法,但有各种原因我不想这样做。

    所以我的问题是:是否有一个排队系统支持延迟交付,而不必在上面放置一堆应用程序逻辑就可以工作?

    1 回复  |  直到 6 年前
        1
  •  0
  •   mjuarez    6 年前

    最新的Kafka版本在每个消息上默认都有一个时间戳,您可以使用它来创建一个人工延迟的流。

    只需创建一个KafkaConsumer,在poll循环中,检查时间戳是否至少是 n 几秒钟前。如果是的话,暂停循环几秒钟(之前我已经使用了5秒钟,但即使是一秒钟也可以处理非常大的音量主题),然后继续正常处理。这将有效地暂停使用者,直到下一个要处理的记录“准备好”(即足够旧),并且它将继续自我调节,始终保持它 n个 离实时还有几秒。

    来自Javadoc的更多信息 KafkaConsumer :

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