java - 客户端->服务器->客户端之间的分布式事务

标签 java transactions jms jta xa

对于一个新项目,我正在寻找能让我的生活变得更轻松的技术。我的新项目基本上是 2 个客户端和一个服务器: 客户端1向服务器发送消息1,服务器向客户端2发送消息1,客户端2对消息1执行某些操作。

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

我的第一个想法是从 client2 向 client1 和服务器发送一 strip 有结果的消息,但仔细考虑一下,这会变得对错误敏感。

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

最佳答案

我不确定单独使用 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、简单 tcp..),您可能会面临回复丢失的情况,并且 C1 永远不会知道 C2 是否处理了消息。在某种程度上,可以通过使 C2 幂等来避免这种情况,并使 C1 在一段时间后没有回复的情况下能够重试事务。

据我所知,没有“黄金解决方案”,但任何选择都可以做得很好。祝你好运

关于java - 客户端->服务器->客户端之间的分布式事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14413353/

相关文章:

java - Spring Boot 反序列化蛇形案例到 Camel 案例失败。无法将 "some_value"反序列化为 "someValue"

transactions - 解码没有abi的交易输入?

MySQL 在连接丢失/断开的情况下回滚事务

sql - 将列添加到表中,然后在事务内更新它

jms - MQ JMS setClientReconnectOptions 没有按预期工作?

java - 我们可以使用 QueueBrowser 只从发送方浏览当前队列中的消息吗?

java - eclipse maven deploy war to nexus OSS Access denied Error code 401, Unauthorized

java - 在 Spring Boot 应用程序中配置 Jackson mixin

java - 刚刚将我的hadoop集群升级到2.4.1,并且一切正常

grails - 应用程序完全启动后,grails jms开始监听