分布式事务Java JMS



我想知道我是否能得到一些关于如何处理我所面临的设计问题的想法。为简单起见,假设有3个端点运行在Tomcat上的3台不同的机器/jvm上。端点有以下职责:

端点1 -接收需求数据并将此数据转换为订单请求

端点2 -接受订单请求,保存订单,并返回订单

端点3 -接受订单,格式化为供应商特定的xml,并将其发送到队列。

编辑:这些端点通过REST作为当前服务存在于其他客户端。我可以选择使用Atomikos作为JTA事务管理器,我们正在使用ActiveMQ。

话虽如此,我有一个接收需求数据消息的队列设置。对于每个接收到的需求数据消息,我本质上希望通过XA将它们通过一个工作单元中的3个端点中的每一个。我完全控制了这3个端点中的每一个,所以我在它们可以使用的通信协议方面有一些灵活性。而且,最终每天会有大约50万到100万条这样的消息进入。你们会用什么通信协议将这些端点在分布式事务中连接在一起?

我对Camel有一些经验,但是如何在一个工作单元中将它们结合在一起却让我不知所措。RMI会比JMS更合适吗?因为这在本质上是同步的。

来自Apache Camel文档:

分布式事务分布式事务是指分布式系统中的事务,事务范围跨越多个网络节点。支持分布式事务的基本先决条件是支持以规范格式传输事务上下文的网络协议(另请参见分布式事务管理器)。分布式事务不在Apache Camel事务的范围之内。

分布式事务管理器通常,服务器直接连接到事务中涉及的资源。然而,在分布式系统中,有时需要连接到仅通过Web服务或CORBA IDL接口间接公开的资源。在这种情况下,您需要一个能够支持分布式事务的TP监视器。有几个标准描述了如何支持各种分布式协议的事务—例如,用于Web服务的WS-AtomicTransactions规范和用于CORBA应用程序的CORBA对象事务服务(OTS)规范。

难怪你被踩了。Apache Camel没有覆盖你的用例。

我认为你有两种选择:

  1. 大分布式事务
  2. 用补偿动作协调较小的事务

tomcat中的JTA JTA是一个全局事务管理器。两种解都需要这个。(不过,如果你选择第二种方法,你可能会做一些巧妙的调整。)Tomcat不能运行JTA事务,但是在transactionmanager的帮助下,它可以。参见Atomikos vs JOTM vs Bitronix vs?添加Spring JtaTransactionManager将有助于使其更容易配置。并非所有JMS实现都支持JTA/XA资源。你得检查一下你的。

分布式事务

事务的持续时间不是很长,但是您将在相当长的一段时间内保持资源锁定,并且您有许多事务。性能会受到影响。

JTA是建立在JTS和OTS之上的。JTA服务器应该能够通过OTS协调与其他JTA服务器的事务。这不是简单的设置,首先您必须找到支持它的实现。然后你必须弄清楚如何让它启动并运行。

在更高的层次上有WS-Transactions和WS-Coordination。参见地铁指南。

补偿动作SOA中的事务建议使用一组协调的较小的事务可能会更好,这些事务不会被回滚,但是可以采取补偿操作来清理步骤失败时发生的混乱。

在超时时发送通知就是这样一种操作。如果您发现订单请求无法满足,则取消您在端点1中发出的订单请求可能是另一种补偿操作。

如果你能走这条路,我愿意。

最新更新