【问题标题】:What data structure should I use for implementing least-expiry-time-remaining-next kind of scheduling我应该使用什么数据结构来实现最少到期时间剩余下一种调度
【发布时间】:2017-05-16 16:16:50
【问题描述】:

我将获得特定类型的物品。每种类型都有与之关联的有效期。在继续对其进行处理之前,每个项目都会保留指定为与其类型关联的到期持续时间的持续时间。

例如,Type1 项目在 10 秒后过期,而 Type2 项目在 5 秒后过期。现在考虑 Type1 item1 在时间 1 出现。所以它应该在时间 11 执行。现在考虑我在时间 2 得到 Type2 item2。所以它应该在时间 7 执行。现在考虑我在时间 3 得到另一个 Type2 item3。所以它应该在时间 8 执行。所以最终的执行顺序是

  • item2 在时间 7
  • item3 在时间 8
  • item1 在时间 11

我应该使用什么数据结构来模拟这种行为?首先,它看起来像优先级队列,它始终将要处理的项目保持在其头部。是否有任何现成的队列服务器可以自动执行此操作。我已经广泛使用了 kafka,但它似乎不能很好地服务于这个目的。还有其他选择吗?还是应该选择普通的 Java 优先级队列?还是我应该寻找与队列完全不同的方法?

更新

  1. 忘了说我可能有很多类型。

【问题讨论】:

  • 您不喜欢优先级队列的哪些方面?您也可以使用保存执行时间/项目的TreeMap<Instant, Item>(假设没有两个项目同时执行)?
  • 您想存储这些类型以备将来使用吗?或者你只是想在给定的时间段后执行它们?如果稍后是您的要求,我建议您使用“Executors.newSingleThreadScheduledExecutor()”,然后按照您所需的时间延迟提交任务。
  • 你看DelayQueue了吗?
  • @assylias TreeMap 听起来不错,但不能保证唯一的执行时间...猜测解决方法...
  • 还有一些消息服务器支持延迟消息传递模式,我想到了 ActiveMQ 和 RabbitMQ 但我有点生疏了。将把研究留给您,看看它是否适用于您的环境 - 例如:activemq.apache.org/delay-and-schedule-message-delivery.html

标签: java data-structures queue message-queue priority-queue


【解决方案1】:

使用DelayQueue 来解决这个确切的用例

【讨论】:

    【解决方案2】:

    您说得对,就开箱即用的实现而言,Kafka 并不适合这一点。

    消息顺序保留在分区中,以便可以保留带有时间戳的到达顺序(您也可以将其添加为字段)。在实现优先级方面,使用上面提供的基础知识应该不会太难。

    队列技术倾向于实现消息传递服务,而您的用例则更面向处理。也许看看一些处理框架,如 Apache Spark 或 Apache Storm。

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 2018-10-28
      • 2014-11-04
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      相关资源
      最近更新 更多