【问题标题】:SQS-style distributed delay queue, but outside of AWS?SQS 风格的分布式延迟队列,但在 AWS 之外?
【发布时间】:2019-04-10 03:08:15
【问题描述】:

我正在寻找一个支持延迟消息传递的分布式排队系统,即消费者只有在生产者发送消息后的指定延迟后才会收到消息。 SQS 是我最熟悉的系统(尤其是 visibility timeout 功能),但我处于 AWS 不受限制的环境中。

我现在看到了一些选项,但都不是很吸引人:

  • 我对@9​​87654323@ 及其TTL feature 不太熟悉,但如果推送来了 推我也许可以拼凑出这个。
  • 有可能使用作业调度程序而不是消息队列,但这对于我的情况来说似乎是一个非常糟糕的阻抗不匹配。
  • 我可以采用数据库即队列的方法,但有各种各样的原因我不想这样做。

所以我的问题是:是否有一个队列系统支持开箱即用的延迟交付,而无需在顶部分层一堆应用程序逻辑来使其工作?

【问题讨论】:

  • 我们与您遇到同样的问题。由于我们有数百条消息等待执行,轮询和重新排队开始变得非常痛苦。您找到解决问题的方法了吗?
  • 还没有,很遗憾。如果我找到解决方案,我一定会在这里发布。

标签: apache-kafka message-queue amazon-sqs producer-consumer distributed-system


【解决方案1】:

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

只需创建一个 KafkaConsumer,并在轮询循环中检查时间戳是否至少为 n 秒。如果是,请暂停循环几秒钟(我之前使用过 5 秒钟非常有效,但即使是一秒钟也适用于非常大量的主题),然后继续正常处理。这将有效地暂停消费者,直到要处理的下一条记录“准备就绪”(即,足够老),并且它会继续自我节流,始终保持n秒远离实时。

更多信息来自KafkaConsumer 上的 Javadoc:

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

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 2014-07-04
    • 2020-07-30
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多