草庐IT

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

coder 2023-05-18 原文

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

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

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

    在分布式环境中,最困难的问题总是归结为让多个事务访问共享数据。似乎有两种常见的并发事务处理方法。
  • Explicit locks(极易出错,并且在分布式系统中跨多个节点进行协调很慢)
  • Software transactional memory(STM)AKA乐观并发,如果事务发现共享状态已更改(并且以后可以重试该事务),则在提交期间回滚该事务。
    哪种方法可以更好地扩展,并且在分布式系统中要进行哪些权衡?

  • 我一直在研究缩放解决方案(以及提供如何缩放示例的一般应用程序),例如:
  • Terracotta-通过使用Java的并发锁定机制(同步的ReentrantReadWriteLocks)扩展Java内存模型以包括分布式共享内存,从而提供“透明”缩放。
  • Google App Engine Java-允许您编写Java(或python)应用程序,这些应用程序将在“云”服务器之间分发,您在这些服务器上分发处理事务的服务器,并使用BigTable存储持久性数据(不确定如何访问共享数据或处理锁争用以便能够有效扩展)
  • Darkstar MMO Server-Darkstar是Sun的开源MMO(大型多人在线)游戏服务器,它们以线程交易方式扩展交易,允许给定交易仅运行一定数量并提交,并且如果需要很长时间,它将回滚(类似于软件)事务性内存)。他们一直在研究supporting a multi-node server setup以进行缩放。
  • Hibernate's optimistic locking-如果您使用的是Hibernate,则可以使用其乐观并发支持来支持software transactional memory类型的行为
  • Apache CouchDB应该自然地“缩放”成网状配置中的许多读取器/写入器DB。 (是否有一个很好的示例说明如何管理锁定数据或确保事务隔离?):
  • JCache-通过将结果缓存到可以在Google Appengine中使用的常见查询来扩展“读取”重型应用程序,以访问memcached并缓存其他经常读取的数据。

  • Terracotta似乎是最完整的解决方案,因为您可以“轻松地”修改现有服务器应用程序以支持缩放(在定义@Root对象和@ AutoLockRead/Write方法之后)。问题是要真正从分布式应用程序中获得最大的性能,对分布式系统的优化并不是真正的事后考虑,您必须在知道对象访问可能被网络I/O阻塞的情况下进行设计。

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

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

    就扩展数据持久层而言,哪种类型的配置最适合将数据分区给许多读取器/许多写入器(通常,我将根据给定的用户(或通常是您所需要的任何核心实体)对数据进行分区“根”对象实体)由单个主数据库拥有)

    最佳答案

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

    结帐http://www.hazelcast.com

    我运行了测试程序,它非常酷,非常轻巧并且易于使用。它会自动检测对等配置中的群集成员。机会是无限的。

    关于java - 集群中分布式事务和/或数据共享的Java解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1616280/

    有关java - 集群中分布式事务和/或数据共享的Java解决方案的更多相关文章

    1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    2. ruby - 通过 ruby​​ 进程共享变量 - 2

      我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

    3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

      我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

    4. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

      有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

    6. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    7. ruby - 分布式事务和队列,ruby,erlang,scala - 2

      我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

    8. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    10. ruby - 我如何添加二进制数据来遏制 POST - 2

      我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

    随机推荐