Java 对于大于堆的基于JVM的队列,有哪些解决方案?

Java 对于大于堆的基于JVM的队列,有哪些解决方案?,java,jvm,queue,Java,Jvm,Queue,我正在研究基于JVM的系统中队列的可能技术选择(或者流是更好的描述) 一些要求: 必须可以从JVM/Java访问 队列必须支持比JVM堆大的大小,可能比所有可用RAM都大。因此,暗示支持将磁盘(或网络)用于存储 队列当前不需要在进程生命周期之后保持持久性 队列的大多数使用将有一个生产者和一个消费者。因此,任何特定队列的并发性都不是问题。(显然,跨队列的并发性很重要。) 队列是临时的。它们突然出现,充满,耗尽,然后消失 小队列最好留在内存中,然后根据资源可用性转移到较慢的存储。这一要求可以在排队

我正在研究基于JVM的系统中队列的可能技术选择(或者流是更好的描述)

一些要求:

  • 必须可以从JVM/Java访问
  • 队列必须支持比JVM堆大的大小,可能比所有可用RAM都大。因此,暗示支持将磁盘(或网络)用于存储
  • 队列当前不需要在进程生命周期之后保持持久性
  • 队列的大多数使用将有一个生产者和一个消费者。因此,任何特定队列的并发性都不是问题。(显然,跨队列的并发性很重要。)
  • 队列是临时的。它们突然出现,充满,耗尽,然后消失
  • 小队列最好留在内存中,然后根据资源可用性转移到较慢的存储。这一要求可以在排队技术之上得到满足

我正在检查几个选项,但很好奇我缺少哪些选项?

使用一个可用的JMS实现。例如,来自雅加达的ActiveMQ或Qpid。

使用Redis作为消息队列如何。它既支持内存中的消息,也可以在数据不适合RAM时使其持久化。

HSQLDB提供进程内数据库引擎,您可以在其中使用RAM、本地磁盘或网络服务器来存储数据库。这可能会让你的船漂浮起来,特别是如果你想无缝地移动到网络解决方案,而不是以后的本地磁盘。从小型队列到大型队列的转换将涉及将数据从一个数据库移动到另一个数据库。有一些标准的方法可以做到这一点,但它们可能相当缓慢


我越想,越觉得这不是一场好的比赛。值得一提的是,在我的经验中,内存中的DB非常快。

我遇到了这个带有溢出到磁盘的FIFO队列,这有点有趣,并且有一些我正在寻找的属性:


我考虑过使用Terracotta的BigMemory作为将队列数据推送到直接内存和堆外的工具

TomTom:虽然我自己可以使用直接内存字节缓冲区来完成一些事情,但我也可以明智地将时间投入到重用现有技术上,以覆盖80%的硬件部分。当然,在许多语言中都有很多这样的实现。如果可能的话,我宁愿把编程的重点放在胶水上,而不是放在内脏上。@Alex,你在寻找本质上是事务性的JMS队列,还是由磁盘存储或数据库支持的纯数据结构实现?Vinet-考虑两者或其他因素。我当然不需要JTA风格的事务。我怀疑JMS IMPL对于我的需要来说太慢了,但这肯定是一种可能性。也许可以尝试qpid的本机接口。当数据存储大于RAM时,Redis无法正常工作。有虚拟机,但它已被弃用,而替代品磁盘存储似乎已被放弃。