2

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

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

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

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

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

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

我对 Camel 有一些经验,但我对如何将它们结合在一个工作单元中感到困惑。RMI 是否会比 JMS 更合适,因为这在本质上似乎是同步的?提前感谢您提供的任何帮助。

4

1 回答 1

2

来自fusesource的 Apache Camel 文档:

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

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

所以难怪你会被踩到。Apache Camel 不涵盖您的用例。

我觉得你可以走两条路:

  1. 大分布式事务
  2. 通过补偿行动协调较小的交易

tomcat 中 的 JTA JTA 是一个全局事务管理器。您可能在两种解决方案中都需要这个。(尽管有一些聪明的摆弄,如果你选择第二个选项,你可能会不用。)Tomcat 不能运行 JTA 事务,但在事务管理器的帮助下它可以。参见Atomikos vs JOTM vs Bitronix vs?. 添加 Spring JtaTransactionManager将有助于使其更易于配置。并非所有 JMS 实现都支持 JTA / 都是 XA 资源。你必须检查你的是否有。

分布式事务 你的事务的持续时间不是很长,但是你仍然会保持资源锁定很长一段时间,并且你有很多事务。性能会受到伤害。

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

在更高的级别上,您有 WS-Transactions 和 WS-Coordination。请参阅地铁指南

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

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

如果你能走这条路,我会接受的。

于 2013-03-27T22:00:00.243 回答