【问题标题】:Distributed transaction between client -> server -> client客户端 -> 服务器 -> 客户端之间的分布式事务
【发布时间】:2013-01-19 10:27:19
【问题描述】:

对于一个新项目,我正在寻找能让我的生活更轻松的技术。我的新项目基本上是 2 个客户端和一个服务器: client1 向服务器发送 message1,服务器向 client2 发送 message1,client2 对 message1 进行处理。

这可以通过普通的 java 套接字或 rmi 或类似技术来完成。但这里有一个问题: 整个过程需要一个事务。我的意思是,当 client2 无法处理 message1 时,client1 和服务器需要知道这一点并回滚已完成的任何操作。

我的第一个想法是从客户端 2 向客户端 1 和服务器发送一条带有结果的消息,但仔细考虑它会变得容易出错。

我已经看过 jms、jta、jca 等技术,但对一切都有些不知所措。而且我怀疑可能有更简单的方法。

【问题讨论】:

    标签: java transactions jms jta xa


    【解决方案1】:

    我不确定单独使用 JTA 或 JMS 是否能解决您的问题,因为即使是分布式事务也仍然在事务资源(例如 JMS 代理和数据库)之间,而不是在应用程序之间。

    在您的情况下,我仍然会选择事务传输,例如 JMS。这将为您提供“保证交付”,这可能会简化错误处理。

    1    c1 -> jms -> server -> jms -> c2   2
    
    4    c1 <- jms <- server <- jms <- c2   3
    

    如果你做对了,你可以确定 c1(和服务器)最终会收到来自 c2 的“结果”,无论好坏。

    如果 C2 在处理过程中崩溃并且未能发回结果 jms 消息,则事务将在 c2 本地回滚,并且 c2 必须重试。

    此解决方案的缺点是消息可能会“卡住”,例如,如果 c2 根本无法处理它,但它永远不会丢失。如果你路由一个同步请求(soap、RMI、simple tcp..),你可能会遇到回复丢失的情况,C1 永远不会知道 C2 是否处理了消息。通过使 C2 具有幂等性并让 C1 能够在一段时间后没有回复时重试事务,可以在某种程度上避免这种情况。

    在我看来,没有“黄金解决方案”,但任何选择都会做得很好。祝你好运

    【讨论】:

    • 感谢您的广泛回复。我很欣赏关于这个主题的想法。我还没有决定如何“做”它,对于此类问题没有太多容易获得的信息。
    • 添加:现在正在考虑将 c2 放在支持事务的 jca 适配器后面。这可能会解决部分问题。
    【解决方案2】:

    对于服务器组件,您可以尝试在 JBoss AS 等成熟的 Java EE 服务器中使用Message Driven Beans。在这种情况下,您的客户端将使用 JMS 与服务器进行通信。

    【讨论】:

    • 感谢您的回复。但这并没有解决我的问题“整个过程需要一个事务”。使用消息驱动的 bean,我只能管理例如服务器和/或客户端上的事务。我无法跨越客户端 1 和服务器以及客户端 2 的事务。你知道如何解决这个问题吗?
    猜你喜欢
    • 2011-02-10
    • 2016-02-16
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多