2012-01-01 118 views
4

我正在制作/准备基于生产者/消费者模型的应用程序。在我的情况下,将会有一个生产者产生几个(非平凡)任务,并且将会有可配置数量的消费者。Java溢出到磁盘的FIFO队列

生产者和消费者之间的沟通基本上是基于队列的。我担心的是内存消耗:可以想象的是,任务数量将超过JVM的可用内存。所以我想有一个Queue实现,它只保留内存中的“top-X”数量的队列项目,并将其余部分存储在磁盘上。这并不一定要有弹性,因为它不需要重新启动程序。

我周围搜索,但无法找到似乎在广泛使用的队列实现(似乎有一些,我称之为概念验证实现,但我很担心关于未来的支持/这些实现的持续发展)。我也研究了外部消息队列应用程序,但是(1)我不想运行第二个外部进程,并且(2)即使在相同的JVM进程中嵌入消息代理似乎对于此要求有点“头重脚轻” 。

有没有人知道任何支持未来的良好支持未来的库,它提供了这种功能?

Rgds

+0

您是否曾经为您的问题找到可靠的解决方案?我期待解决相同的情况。谢谢! – joe 2016-05-02 19:25:24

回答

1

那么,JMS似乎是明显的解决方案。因为JMS解决了这个问题,所以我认为你不会找到可靠的解决方案来解决这个问题,它是一个标准的解决方案。

但是请注意,Java也有BoundedQueues来解决这个问题:维护队列以确保它在队列满时不会因OOME而失败,并且在尝试将消息放入完整有界队列,直到其中一个消费者从队列中删除某个任务。

+0

的确,我已经考虑使用BoundedQueue(并且还没有排除)。听起来是这样,制作生产者区块效率不高。 – 2012-01-01 12:20:56

+0

顺便说一句。我不同意这样的假设,即JMS存在并解决了这个问题,即没有其他解决方案/实现的空间。对于这样的事情,JMS严重地过分。例如,这个“限制内存的队列”可能是嵌入式系统中的一个需求,在这个嵌入式系统中,没有用于JMS消息代理的空间/资源。 – 2012-01-01 12:23:21

+0

如果生产者对消费者而言过于快速,那么阻止生产者将允许消费者为他们分配更多的CPU时间(或带宽),因此生产和消费许多任务所花费的总时间可能与一个磁盘备份的队列(或者更低,因为你避免了读/写磁盘的需要) – 2012-01-01 12:24:17

0

当有足够多的任务需要使用时,拥有生产者块通常比让队列增长并消耗更多内存更高效。例如如果您的队列适合队列,它可能会比没有队列的队列快几倍。