【问题标题】:Maintaining ordering in multithreaded apache camel application在多线程 apache camel 应用程序中维护排序
【发布时间】:2018-12-11 00:39:26
【问题描述】:

我们使用Tibco EMS 作为我们的消息传递系统,并使用apache camel 来编写我们的应用程序。在我们的应用程序中,消息被写入队列。 concurrentConsumers 设置为 8 的组件从队列中读取,处理消息,然后写入另一个队列。另一个组件,同样将concurrentConsumers 设置为 8,然后从这个新队列中读取,依此类推。到目前为止,维护消息顺序并不重要,但一个新的要求意味着它现在很重要。看骆驼文档,建议使用jmsxgroupid来维护排序。不幸的是,Tibco EMS 不提供此功能。在多线程应用程序中是否有其他方法可以在骆驼中保持顺序?我看过粘性负载平衡,但这似乎只适用于端点负载平衡。

谢谢

布鲁斯

【问题讨论】:

  • 并发执行不能保证顺序...尤其是当任务需要不同的时间来执行...EG网络操作,比如发送消息...
  • 在此链接查看重测序器 EIP:camel.apache.org/resequencer.html
  • 为什么 jmsxgroupid 不能与 TIBCO EMS 一起使用?它是从那天开始支持的 JMS 规范的一部分(查看文档)

标签: java multithreading apache-camel


【解决方案1】:

在企业集成领域,我们一般使用Resequencer设计模式来解决这类需要保证消息顺序的问题。

Apache Camel 涵盖了广泛的企业集成模式,包括以 Resequencer 为核心的模式,并且它为这些模式提供了开箱即用的实现。所以你要找的应该是这个:
http://camel.apache.org/resequencer.html

在您的具体情况下,您需要做的就是添加一个自定义消息头,如myMessageNo,它有一个指定顺序的序列号,用于发送到 TIBCO EMS 的消息。然后,在消费者端,使用重新排序器 EIP 来恢复来自 TIBCO EMS 的传入消息的顺序。

但是,正如您所见,这并不像将重定序器 EIP 放到您的 Camel 路由中那么简单。 (任何异步解决方案总是很难正确构建。)对于重定序器,您需要考虑何时发生悲伤路径,例如当一些消息丢失并且永远无法到达时。为了确保您的路由即使在那些特殊情况下也能正常工作,您需要从两个选项中进行选择:最大批量大小或超时。根据选择的条件,当批处理达到最大大小或超时等待丢失消息时,重排序器将刷新消息。

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多