gpt4 book ai didi

java - Java 中的并行和事务处理 (Java EE)

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:16 24 4
gpt4 key购买 nike

我有一个关于如何在 Java/Java EE 中处理事务性和可扩展性大任务的架构问题。

总挑战

我有一个 Web 应用程序(现在是 Tomcat,但这不应该限制解决方案的空间,所以仅以此来说明我想要实现的目标)。这个 Web 应用程序分布在多个(虚拟和物理)节点上,连接到一个中央 DBMS(在这种情况下是 MySQL,但同样,这不应该限制解决方案......)并且能够处理大约 1000 个用户、服务页面、做事,就像您对普通的基于 Web 的信息系统所期望的那样。

现在,有些任务会影响较大部分的数据,因此应该优化系统以合理快速地执行这些任务。 (比顺序处理所有东西都快,也就是说)。所以我会让任务并行并将其分布在几个(或所有)节点上:

Vision - what I'd like to have

(注意:处理的数据部分是独立的,所以这里没有数据库或锁定冲突)。

问题是,我希望(整个)任务是事务性的。因此,如果其中一个并行子任务失败,我希望所有其他任务都因此回滚。否则,从域的角度来看,系统将处于潜在的不一致状态。

当前实现

正如我所说,当前的实现使用 Tomcat 和 MySQL。节点使用 JMS 进行通信(因此有一个 JMS 服务器,调度程序将每个子任务的消息发送到该服务器;执行程序从消息队列中获取任务,执行它们,并将结果发布到结果队列,调度程序从中收集消息结果。调度程序阻塞并等待所有结果进来,如果一切正常,它会以 OK 状态终止。

这里的问题是所有的执行者都有自己的本地事务上下文,所以图片看起来像这样:

Current implementation

如果由于某种原因其中一个子任务失败,则本地事务将回滚并且调度程序会得到一个错误结果。 (这里有一些故障安全机制,它试图重复失败的事务,但让我们假设由于某种原因,一个任务无法完成)。
问题是系统现在处于一种状态,除了一个事务之外,所有事务都已提交并完成。而且因为我无法成功完成最后一笔交易,所以我无法摆脱这种状态。

可能的解决方案

这些是我迄今为止遵循的想法:

  • 我可以以某种方式自己实现特定于域的回滚机制。因为分发器知道已经执行了哪些任务,所以它可以显式地恢复效果(例如,将旧值存储在某处并将已经提交的值恢复到以前的值)。当然,在这种情况下,我必须保证没有其他进程对其进行更改,因此只要大操作正在运行,我还必须将系统设置为只读状态。
    或多或少,我需要在业务逻辑中模拟事务...
  • 我可以选择不在一个大事务中的单个节点上并行化和做所有事情(但正如开头所说,我需要加快处理速度,所以这不是一个选项......)
  • 我曾试图了解 XATransactions 或分布式事务,但这似乎是一个高级 Java EE 功能,并未在所有 Java EE 服务器中实现,并且不会真正解决这个基本问题,因为似乎没有是一种在异步调用中将事务上下文传输到远程节点的方法。 (例如,EJB Specification 3.1 的第 4.5.3 节:“客户端事务上下文不会通过异步方法调用传播。从 Bean 开发人员的角度来看,从来没有从客户端流入的事务上下文。”)

  • 问题

    我是否忽略了什么?是否不可能在多个节点上异步分发任务,同时具有可以作为整体回滚的(共享)事务状态?

    感谢您的任何指示,提示,命题......

    最佳答案

    如果您想按照描述分发您的应用程序,JTA是您在 Java EE 上下文中的 friend 。由于它是 Java EE 规范的一部分,因此您应该能够在任何兼容的容器中使用它。与规范的所有实现一样,细节或配置也存在差异,例如 JPA,但在现实生活中,经常更改应用程序服务器是非常罕见的。

    但是,在不了解问题的详细信息和复杂性的情况下,我的建议是重新考虑您是否真的需要共享一个用例的任务执行,或者是否不可能并且更好地将属于该用例的所有内容都包含在一个用例中节点,即使整个应用程序可能需要多个节点。如果您真的必须使用多个节点来满足您的要求,那么我会选择不直接写入数据库的分布式任务,而是返回结果,然后在启动任务的一个组件中提交/回滚它们。

    在过度设计架构之前,不要忘记先进行测量。一开始尽量保持简单,假设一个节点可以处理它,然后编写一个压力测试来尝试破坏您的系统,以了解它在给定架构下可以处理的最大可能负载。

    关于java - Java 中的并行和事务处理 (Java EE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24490853/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com