分布式事务和/或群集中共享数据的Java解决方案

集群/分发Java服务器应用程序的最佳方法是什么? 我正在寻找一种方法,允许您通过添加更多的应用程序服务器和更多的数据库服务器来横向扩展。

  • 您会建议采用哪些技术(软件工程技术或特定技术)来解决此类问题?
  • 您使用哪些技术来设计持久层以扩展到许多读取器/写入器扩展应用程序事务并扩展对共享数据的访问(最佳方法是消除共享数据;可以应用哪些技术来消除共享数据)。
  • 似乎需要使用不同的方法,具体取决于您的事务是读取还是写入繁重,但我觉得如果您可以优化“写入”繁重的应用程序,这对于“读取”也是有效的

“最佳”解决方案允许您为单个节点编写Java应用程序,并希望“隐藏”访问/锁定共享数据的大部分细节。

在分布式环境中,最困难的问题总是归结为多个事务访问共享数据。 似乎有两种常见的并发事务方法。

  1. 显式锁 (在分布式系统中的多个节点之间极易出错并且协调速度很慢)
  2. 软件事务内存 (STM)AKA乐观并发,如果事务发现共享状态已更改(并且稍后可以重试事务),则在提交期间回滚事务。 哪种方法可以更好地扩展,在分布式系统中有哪些权衡取舍?

我一直在研究扩展解决方案(以及提供如何扩展的示例的一般应用程序),例如:

  1. Terracotta – 通过使用Java的并发锁定机制(synchronized,ReentrantReadWriteLocks)扩展Java内存模型以包含分布式共享内存,提供“透明”扩展。
  2. Google App Engine Java – 允许您编写Java(或python)应用程序,这些应用程序将分布在“云”服务器中,您可以在其中分发服务器处理事务,并使用BigTable存储持久数据(不确定访问共享的事务的方式)数据或处理锁定争用,以便能够有效扩展)
  3. Darkstar MMO服务器 – Darkstar是Sun的开源MMO(大型多人在线)游戏服务器,它们以线程事务方式扩展事务,允许给定事务仅运行一定量并提交,如果需要很长时间,它将回滚(有点像软件事务内存)。 他们一直在研究支持多节点服务器设置以进行扩展。
  4. Hibernate的乐观锁定 – 如果你使用的是Hibernate,你可以使用它们的乐观并发支持来支持软件事务内存类型的行为
  5. Apache CouchDB应该自然地以网状配置“扩展”到许多读写器DB。 (有一个很好的例子,说明如何管理锁定数据或确保事务隔离?):
  6. JCache – 通过将结果缓存到您可以在Google appengine中使用的常见查询来扩展“读取”繁重的应用程序,以访问memcached并缓存其他经常读取的数据。

Terracotta似乎是最完整的解决方案,因为您可以“轻松”修改现有服务器应用程序以支持扩展(在定义@Root对象和@AutLockRead / Write方法之后)。 问题是真正从分布式应用程序中获得最大的性能,分布式系统的优化实际上并不是真的,你必须设计它,知道对象访问可能被网络I / O阻止。

为了正确扩展,似乎总是归结为分区数据和负载平衡事务,例如给定的“执行单元”(cpu core – > thread – >分布式应用程序节点 – > DB主节点)

似乎通过群集使任何应用程序正确扩展,您需要能够根据其数据访问读/写对事务进行分区。 人们提出了哪些解决方案来分发他们的应用程序数据(Oracle,Google BigTable,MySQL,数据仓库),以及一般如何管理分区数据(许多写入主数据库,以及更多读取数据库等)。

在扩展数据持久层方面,在将数据划分给许多读者/多个编写者方面,哪种类型的配置最佳扩展(通常我会基于给定用户(或通常是您的任何核心实体)对数据进行分区“root”对象实体)由单个主DB拥有

以为我找到了一个很棒的Java集群/分布式平台,想重新打开这个 –

结帐http://www.hazelcast.com

我运行测试程序,非常酷,重量很轻,使用简单。 它会以对等配置自动检测群集成员。 机会是无限的。

感谢您在一个地方很好地总结所有可能性。

但是这里缺少一种技术。 它是MapReduce-Hadoop。 如果可以将问题纳入MapReduce范例,它可能是最广泛可用的解决方案。 我也想知道Actor Framework模式(JetLang,Kilim等)是否可以扩展到集群。

  • 不要忘记Coherence和GigaSpaces 。

不要忘记Erlang的Mnesia 。

Mnesia为您提供了在常规数据库中习惯的事务,但提供了实时操作和容错function。 此外,您可以在不停机的情况下重新配置。 缺点是它是一个内存驻留数据库,所以你必须分割非常大的表。 最大的桌子尺寸是4Gb。

虽然Oracle Coherence和许多其他建议的解决方案都有利于共享数据,但您只引用了锁定和STM作为在分布式环境中管理状态变异的方法; 这些都是衡量国家管理规模的通常很差的方法。 在另一个站点上,我最近发布了以下有​​关如何实现(例如)序列计数器的信息:

如果你正在寻找一个计数器,那么使用像Coherence EntryProcessor这样的东西将很容易实现“一次一次”的行为和HA,可用于任意数量的单调递增序列; 这是整个实施:

public class SequenceCounterProcessor extends AbstractProcessor { public Object process(InvocableMap.Entry entry) { long l = entry.isPresent() ? (Long) entry.getValue() + 1 : 0; entry.setValue(l); return l; } } 

对。 而已。 自动和无缝HA,动态横向扩展弹性,一次性行为等。完成。

EntryProcessor是我们在2005年推出的一种分布式闭包。

另外,在Java 8(尚未发布)中,Lambda项目在语言和标准库中引入了官方闭包支持。

基本上,这个想法是将闭包传递到分布式环境中数据“所有者”的位置。 Coherence通过使用动态分区动态管理数据所有权,允许分布式系统在运行的各种计算机和节点之间对数据进行负载平衡。 事实上,默认情况下,所有这些都是100%自动化的,因此您实际上从未告诉它将数据放在何处,或者数据在哪里。 此外,还有其他节点和其他物理服务器上管理的数据的二级(也许是三级等)副本,以便在进程失败或服务器死亡时提供高可用性。 同样,默认情况下,这些备份副本的管理是完全自动的并且完全同步,这意味着默认情况下系统是100%HA(即没有配置)。

当闭包到达数据所有者时,它在事务工作空间中执行,如果操作成功完成,则将其发送到备份以便安全保存。 一旦备份成功完成,数据突变(例如操作的结果)仅对系统的其余部分可见。

对上述内容的一些优化包括添加ExternalizableLite和PortableObject接口以优化序列化,并通过直接追踪数据的“网络就绪”forms来避免盒装长序列化:

 public Object process(InvocableMap.Entry entry) { try { BinaryEntry binentry = (BinaryEntry) entry; long l = entry.isPresent() ? binentry.getBinaryValue() .getBufferInput().readLong() + 1 : 0L; BinaryWriteBuffer buf = new BinaryWriteBuffer(8); buf.getBufferOutput().writeLong(l); binentry.updateBinaryValue(buf.toBinary()); return l; } catch (IOException e) { throw new RuntimeException(e); } } 

既然它是无国籍的,为什么不准备一个单例实例呢?

 public static final SequenceCounterProcessor INSTANCE = new SequenceCounterProcessor(); 

从网络上的任何地方使用它就像一行代码一样简单:

 long l = (Long) sequences.invoke(x, SequenceCounterProcessor.INSTANCE); 

其中“x”是标识您要使用的特定序列计数器的任何对象或名称。 有关详细信息,请参阅Coherence知识库: http : //coherence.oracle.com/

Oracle Coherence是一个分布式系统。 每当启动Coherence节点时,它都会与已在运行的其他Coherence节点连接,并动态形成弹性集群。 该集群以分区,高可用性(HA)和事务一致的方式托管数据,并托管以“一次且仅一次”方式对该数据进行操作的操作(如上所示)。

此外,除了能够从任何Coherence节点透明地调用任何逻辑或访问任何数据外,您还可以调用任何逻辑或从网络上的任何进程透明地访问任何数据(需要进行身份validation)和授权,当然)。 因此,此代码可以在任何Coherence集群节点或任何(Java / C / C ++ / C#/ .NET)客户端上运行:

为了充分披露,我在Oracle工作。 本文中表达的观点和观点是我自己的,不一定反映我的雇主的意见或观点。

也许这些幻灯片会有所帮助。 根据我们的经验,我会推荐Oracle(Tangosol)Coherence和GigaSpaces作为最强大的数据和处理分发框架。 根据问题的确切性质,其中一个可能会发光。 兵马俑也适用于一些问题。