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

用于在集群中共享分布式事务和/或数据的Java解决方案,java,concurrency,transactions,scalability,optimistic-locking,Java,Concurrency,Transactions,Scalability,Optimistic Locking,集群/分发Java服务器应用程序的最佳方法是什么? 我正在寻找一种方法,它允许您通过添加更多的应用程序服务器和数据库服务器来横向扩展 您建议采用什么技术(软件工程技术或特定技术)来解决此类问题 您使用什么技术来设计一个持久层以扩展到许多读写器 扩展应用程序事务并扩展对共享数据的访问(最好的方法是消除共享数据;您可以应用什么技术来消除共享数据) 根据您的事务是读重还是写重,似乎需要不同的方法,但我觉得如果您能够优化一个“写”重的应用程序,它对“读”也是有效的 “最佳”解决方案将允许您为单个节点

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

  • 您建议采用什么技术(软件工程技术或特定技术)来解决此类问题
  • 您使用什么技术来设计一个持久层以扩展到许多读写器 扩展应用程序事务并扩展对共享数据的访问(最好的方法是消除共享数据;您可以应用什么技术来消除共享数据)
  • 根据您的事务是读重还是写重,似乎需要不同的方法,但我觉得如果您能够优化一个“写”重的应用程序,它对“读”也是有效的
“最佳”解决方案将允许您为单个节点编写Java应用程序,并希望“隐藏”访问/锁定共享数据的大部分细节

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

  • (在分布式系统中,跨多个节点协调时极易出错且速度较慢)
  • (STM)又称乐观并发,在提交过程中,如果事务发现共享状态已更改,则会回滚该事务(稍后可以重试该事务)。 在分布式系统中,哪种方法的可扩展性更好,权衡是什么
  • 我一直在研究缩放解决方案(以及提供如何缩放示例的一般应用程序),例如:

  • -通过使用Java的并发锁定机制(同步、可重入的写锁),扩展Java内存模型以包括分布式共享内存,从而提供“透明”的扩展
  • -允许您编写Java(或python)应用程序,这些应用程序将分布在“云”服务器之间,在这些服务器上,您分布处理事务的服务器,并使用BigTable存储持久数据(不确定如何访问共享数据或处理锁争用的事务,以便能够有效扩展)
  • -Darkstar是Sun的开源MMO(大型多人在线)游戏服务器,它们以线程事务方式扩展事务,允许给定事务只运行一定数量并提交,如果需要很长时间,它将回滚(有点像软件事务内存)。他们一直在研究伸缩性
  • -如果您使用的是Hibernate,则可以使用其乐观并发支持来支持类型行为
  • 在网格配置中,应该“扩展”到多个读写器DB。(有没有一个很好的例子说明如何管理锁定数据或确保事务隔离?)
  • -通过将结果缓存到常见查询,扩展“读取”量较大的应用程序,您可以在Google appengine中使用这些查询来访问memcached和缓存其他频繁读取的数据
  • Terracotta似乎是最完整的解决方案,因为您可以“轻松”修改现有服务器应用程序以支持扩展(在定义@Root对象和@autolockdead/Write方法之后)。问题是要真正从分布式应用程序中获得最大的性能,分布式系统的优化并不是真正的事后思考,您必须在设计它时了解到对象访问可能会被网络I/O阻塞

    为了适当地扩展,它似乎总是归结为对数据进行分区和负载平衡事务,这样一个给定的“执行单元”(cpu核心->线程->分布式应用程序节点->数据库主节点)

    看起来,要通过集群实现任何应用程序的适当扩展,您需要能够根据事务的数据访问读/写对其进行分区。人们提出了哪些解决方案来分发他们的应用程序数据(Oracle、Google BigTable、MySQL、数据仓库),以及通常如何管理分区数据(许多写主机,以及更多的读数据库等)


    在扩展数据持久性层方面,在将数据分区到多个读卡器/多个写卡器(通常我会基于单个主数据库拥有的给定用户(或通常是“根”对象实体的任何核心实体)对数据进行分区方面,哪种配置类型的扩展效果最好感谢您在一个地方很好地总结了所有可能性

    不过,这里缺少一项技术。这是MapReduceHadoop。如果有可能将问题放入MapReduce范例中,那么它可能是最广泛可用的解决方案。我还想知道Actor框架模式(时差、Kilim等)是否可以扩展到集群。

    别忘了Erlang的

    Mnesia为您提供了像事务这样的东西,您在普通数据库中已经习惯了这些东西,但它提供了实时操作和容错能力。此外,您还可以在不停机的情况下重新配置设备。缺点是它是一个内存驻留数据库,所以您必须对非常大的表进行分段。最大表大小为4Gb。

    • 别忘了,还有

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

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

        结帐


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

        而Oracle Coherence和许多其他建议的解决方案对
        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;
                }
            }
        
        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);