6

我的要求是跨集群共享一个 java 对象。

我有点迷惑不解了

  • 是否编写 EJB 并跨集群共享 java 对象,或者
  • 使用任何第三方,例如 infinispan 或 memecached 或 terracotta 或
  • JCache 呢?

具有以下约束

  • 我无法更改任何特定于任何应用程序服务器的源代码(例如实现 weblogic 的单例服务)。
  • 我不能为集群和非集群环境提供两个版本。
  • 性能不应降级。
  • 如果我需要使用它,我只寻找开源第三方。
  • 它也需要在 weblogic 、 Websphere 、 Jbos 和 Tomcat 中工作。

考虑到这些限制,任何人都可以提出最佳选择。

4

3 回答 3

4

它可以取决于您要在集群中共享的对象的用例。

我认为这归结为最复杂到最不复杂的以下选项

分布式缓存 http://www.ehcache.org

如果您需要确保可以从每个节点上的缓存访问对象,则分布式缓存非常有用。我已经使用 ehache 非常成功地分发,除非您需要规模,否则无需设置兵马俑服务器,只需通过 rmi 将实例指向一起即可。还可以根据要求同步和异步工作。如果节点出现故障,缓存复制也很方便,因此缓存实际上是冗余的并且不会丢失任何东西。如果您需要确保对象已在所有节点上更新,那就太好了。

集群执行/数据分发 http://www.hazelcast.com/

Hazelcast 也是一个不错的选择,因为它提供了一种跨集群执行 java 类的方法。如果您有一个代表需要执行的工作单元的对象并且您不太关心它在哪里执行,这将更加有用。

对于分布式集合也很有用,即分布式映射或队列

滚动你自己的 RMI/Jgroups

可以编写自己的客户端/服务器,但我认为如果您处理的对象的要求开始变得复杂,您将开始遇到更大框架解决的问题。实际上,Hazelcast 非常简单,应该真正消除自己滚动的需要。

于 2013-08-07T12:42:29.907 回答
1

它不是开源的,但 Oracle Coherence 可以轻松解决这个问题。

如果您需要 JCache 的实现,我知道今天唯一可用的是 Oracle Coherence;请参阅:http ://docs.oracle.com/middleware/1213/coherence/develop-applications/jcache_part.htm

为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。

于 2014-07-11T13:53:24.887 回答
0
  • 这只是一个想法。您可能想检查确切的实现。
  • 它会降低性能,但我不知道如何避免它。
  • 实施起来并不容易。可能你应该考虑负载平衡而不是集群。

您可能会考虑 RMI 和/或动态代理。

  • 提取对象的接口。
  • 使用 RMI 访问真实对象(从所有集群,甚至是实际持有该对象的集群)
  • 为了为现有代码创建 RMI,您可能会使用动态代理(再次......不确定实现)

*动态代理可以包装任何对象并在每次方法调用时执行一些前后任务。在这种情况下,它可能会使用原始对象进行 RMI 调用

  • 您需要集群之间的连接才能传播 RMI 对象。
于 2013-08-07T12:26:52.987 回答