Java 消息的高性能存储

Java 消息的高性能存储,java,jakarta-ee,messaging,Java,Jakarta Ee,Messaging,我一直在寻找用于在JavaEE环境中持久化soap消息的高性能文件存储解决方案 我们目前在OracleRMDB上使用CLOB表,但扩展成本非常高。虽然oracle可以很好地存储相关的元数据,但它对消息内容的处理效果并不太好。有CLOB的表上的Insert的性能比没有CLOB的表差大约1000%(这是通过比较VARCHAR2(4000)-Insert和CLOB Insert在CLOB禁用行内存储时的性能来衡量的) 在文件系统上持久化消息是一种选择,但我严重怀疑一般的文件系统每天存储数百万个文件的性

我一直在寻找用于在JavaEE环境中持久化soap消息的高性能文件存储解决方案

我们目前在OracleRMDB上使用CLOB表,但扩展成本非常高。虽然oracle可以很好地存储相关的元数据,但它对消息内容的处理效果并不太好。有CLOB的表上的Insert的性能比没有CLOB的表差大约1000%(这是通过比较VARCHAR2(4000)-Insert和CLOB Insert在CLOB禁用行内存储时的性能来衡量的)

在文件系统上持久化消息是一种选择,但我严重怀疑一般的文件系统每天存储数百万个文件的性能。考虑到我们必须把这些文件保存几个月,这听起来不太对劲

我知道有几个开源的键值数据库(jackrabbit、mongodb等等)可以完成这项任务,但我就是没时间对它们进行评估。我还想听听开源RMDB的性能

考虑到传输的消息量不断增加,优先考虑的是低延迟和高性能。我们不需要集群或事务性,系统故障时(轻微)数据丢失是可以接受的

要求:

  • 当消息大小为8KB时,必须能够保持至少100persisted messages/sec的速率
  • 必须能够存储至少1亿条消息
  • 必须支持按年龄删除持久化邮件
  • 删除过程中必须支持持久化
  • 必须支持按id检索邮件
感谢您的帮助

这是MongoDB和SQL Server之间很好的比较(我相信Oracle也会有类似的性能)。从图表中可以看出,Mongo每秒可以处理20000次插入。Mongo还有一种基于JSON的查询语言,它几乎可以做任何事情,比如常规SQL,它有分片集群和副本集,可以处理所有必要的备份和故障切换(一些基本信息)


此外,如果你有兴趣深入挖掘,10Gen将在两周内获得一份证书

您可以尝试以下产品:

  • 糖化血红蛋白
  • 蒙哥达
  • 卡桑德拉
  • Solr 4.0(仅限)
这些都是我有经验的人。市场上还有很多其他的好产品可以满足你的需求

一些观察结果:据我所知,他们中没有一个拥有这种“按年龄删除”功能。但实现起来应该非常简单。我想在莫戈德更容易

如果您要尝试Solr,您应该坚持使用版本4.X,因为它们是唯一支持近实时提交的版本,这将影响您的“删除并插入”要求


它们都有很好的性能,但我没有按照您的要求运行基准测试。如果我是你,我会制定自己的基准。

Oracle11g引入了重复数据消除功能。此功能将通过clob提高oracle数据库的性能。

这是我到目前为止发现的。在评估每种产品后,我将尝试更新此答案

我使用MongoDB开始了我的实验,从纸面上看,这是一个可行的选择。以下是我的调查结果摘要:

  • 用C写的++
  • 复制(replicaset)需要3个节点才能实现高可用性
  • 其中一个节点被选为主节点-只有主节点可以写入
  • 向外扩展是通过分片(分区)完成的
  • 每个分片本质上是一个复制集,因此分片环境至少需要6个节点才能实现高可用性
  • mongod实例占用所有可用内存-虚拟化应用于资源分区(如果您打算在同一硬件上运行application server)
  • 大师级连任最长可能需要1分钟
  • 文档集合(表)在写入操作期间使用独占锁
  • JavaAPI非常易于使用,并包括一个名为GridFS的虚拟文件系统
  • 对于1KB文档,测试系统上的单节点写入性能约为20000次插入/秒
  • 对于1KB的文档,单节点读取性能约为20000次读取/秒
MongoDB在两个数据中心配置上需要6个节点,这一事实让我进一步寻找更经济高效的解决方案

阿帕奇·卡桑德拉:

  • 用Java编写
  • 复制需要3个节点才能实现高可用性
  • 数据库在网络分区中生存
  • 复制算法是为多个数据中心设计的
  • 所有节点都是可写的
  • 可以通过添加更多节点(达到一定限制)来进行向外扩展
  • Cassandra可能需要JVM垃圾收集调优
  • JavaAPI不是最容易使用的
  • 对于1KB的文档,单节点写入性能约为7000次插入/秒
  • 对于1KB的文档,单节点读取性能约为7000次读取/秒
虽然Cassandra在单节点配置中速度较慢,但在高可用性配置中的写入性能将与MongoDB的性能相匹配。在每个节点上执行写操作的能力(甚至在网络分区期间)对于日志记录来说是非常受欢迎的

沙发床:

不幸的是,我无法测试Couchbase


目前,我们将继续使用Oracle安全文件。我们是否会耗尽Oracle上的资源,Cassandra和MongoDB似乎都是可行的替代方案。

我会尝试couchDB,但我不知道这比其他数据库解决方案更适合您的使用。你会想把它们都读一遍的。此外,如果您的IT/DBA不支持mongodb或couchdb,您可能希望使用它们。实际上,我们通过将lob存储切换到SECUREFILES来降低Oracle的负载。尽管如此,我认为我仍然