1

这可能是不可能的,但我想我可以试一试。我有一些处理一些数据的工作,它对处理的每个数据做出 3 个决定:保留、丢弃或修改/重新处理(因为它不确定保留/丢弃)。这会生成大量数据,因为重新处理可能会将数据分解为许多不同的部分。

我最初的方法是将其发送到正在处理数据的执行服务,但由于要处理的项目数量很大,我很快就会耗尽内存。然后我决定可能将队列卸载到消息传递服务器(rabbitmq),它工作正常,但现在我受网络 IO 的约束。我喜欢 rabbitmq 的地方在于它将内存中的消息保持到一定水平,然后将旧消息转储到本地驱动器,因此如果我的服务器上有 8 gig 的内存,我仍然可以拥有 100 gig 的消息队列。

所以我的问题是,在 Java 中是否有任何具有类似功能的库?我可以用作非阻塞队列的东西,它只在队列中保留 X 个项目(按项目数或大小)并将其余的写入本地驱动器。

注意:现在我只要求在一台服务器上使用它。将来我可能会添加更多服务器,但因为每台服务器都是自生成数据,所以如果一台服务器的队列为空,我会尝试从一个队列中获取消息并将它们推送到另一个队列。该库不需要网络访问,但我需要从另一个 Java 进程访问队列。我知道这是一个很长的镜头,但我想如果有人知道它会是这样。

4

3 回答 3

1

不确定它是否是您正在寻找的方法,但为什么不使用像 hsqldb 这样的轻量级数据库和像 hibernate 这样的持久层呢?您可以将消息保存在内存中,然后提交到 db 以保存在磁盘上,然后使用方便的 SQL 查询来查询它们。

于 2012-05-04T15:48:56.513 回答
0

实际上,正如 Cuevas 所写,HSQLDB 可能是一个解决方案。如果您使用提供的“缓存表”,您可以指定使用的最大内存量,超过的数据将被发送到硬盘驱动器。

于 2012-05-04T16:07:44.757 回答
0

使用文件系统。这是老派,但有很多工程师因为懒惰而被图书馆所困扰。确实,HSQLDB 提供了许多增值功能,但在轻量级的背景下......

于 2017-10-02T23:11:35.740 回答