【发布时间】:2013-03-16 22:54:51
【问题描述】:
我想知道我是否可以就如何处理我面临的设计问题获得一些想法。为简单起见,假设我有 3 个端点在 Tomcat 上的 3 台不同的机器/jvm 上运行。端点具有以下职责:
端点 1 - 接收需求数据并将此数据转换为订单请求
端点 2 - 接受订单请求,保存订单并返回订单
端点 3 - 接收订单,格式化为供应商特定的 xml,然后将其发送到队列。
编辑:这些端点作为当前服务存在,通过 REST 提供给其他客户端。我可以选择将 Atomikos 用于 JTA 事务管理器,我们正在使用 ActiveMQ。
话虽如此,我有一个接收需求数据消息的队列设置。对于每个收到的需求数据消息,我基本上想通过 XA 将它们汇集到一个工作单元中的 3 个端点中的每一个。我完全控制了 3 个端点中的每一个,因此我在它们可以使用的通信协议方面具有一定的灵活性。此外,最终每天将有大约 50 万到 100 万条此类消息进入。你们会使用什么通信协议在分布式事务中将这些端点联系在一起?
我有一些使用 Camel 的经验,但我不知道如何将它们整合到一个工作单元中。 RMI 是否会比 JMS 更合适,因为这在本质上似乎是同步的?提前感谢您提供的任何帮助。
【问题讨论】:
-
这些事务需要运行多长时间?它们需要多久回滚一次?
-
从我的角度来看,一方面说我想解耦并采取异步方法是没有意义的,另一方面我想通过说 step 来高度耦合它们只有当第 3 步成功时,第 1 步才成功。而且您应该意识到,长时间运行的事务会损害此类系统的吞吐量。所以对于你的最后一个问题:是的,像 RMI 或具有单个控制器的 WebServices 这样的同步协议将减轻你的工作,并有助于保持交易的简短,因为它们同步良好。
-
@Sir RotN,感谢您的回复和想法。尽管我试图将这些端点组合到一个事务中,但这些端点当前作为其他客户端的服务存在。它们具有 UI 可以使用的 REST 服务接口。
-
@flup 感谢您的快速回复。事务需要运行不超过 5 分钟,尽管每个进程单独完成的时间不应超过几秒钟。这些事务只需要在数据库不可用或完整流程无法在 5 分钟内完成等问题时回滚。总体而言,每天需要回滚的希望不到 1%。
-
太好了。 REST 服务同时是最重要的“WebServices”组。因此,您只需让它们支持 XA 事务 id 和(如果尚未完成)json 或 xml 作为结果。然后编写一个控制器来打开事务,触发三个 REST 调用并提交。听起来很简单。
标签: jms apache-camel distributed-computing jta xa