【问题标题】:How to solve batch processing in ESB?如何解决 ESB 中的批处理问题?
【发布时间】:2012-10-26 17:06:32
【问题描述】:

我们有一个遗留系统,该系统生成的文件每个都包含数百条消息(金融交易)。我们需要将这些消息转换成另一种格式,并将它们(单独)提交到目标系统。问题是: ESB 应该直接接受这些文件进行处理,还是应该在遗留系统和 ESB 之间存在一个适配器应用程序,将接收到的文件拆分为单独的消息,并让 ESB 单独处理消息(而不是处理整个文件)?

在第一个解决方案中,我们期望两个 ESB 流。第一个将文件转换为新格式,将其拆分为消息,并将这些消息存储到临时位置。转换需要将文件作为一个整体进行处理,因为该文件包含转换单个消息所需的一些公共部分。 第二个流程将获取单独的转换消息(每个都在一个单独的 DB 事务中),将它们传递给目标系统,然后等待它的响应(同步或异步)。

第二种解决方案将用一个外部应用程序替换第一个流,该应用程序将转换文件,将其拆分为单独的转换消息,并将它们存储在临时位置(本地文件系统)。第二个流将保留在 ESB 中。

在我们看来,第一个解决方案的缺点是 ESB 必须处理大文件(在第一个流程中),这通常被认为是一种反模式。另一方面,ESB会直接适应遗留系统的接口,这也是ESB的目的之一。

在第二种解决方案中,适配器应用程序将包含转换逻辑,这应该是 ESB 的另一个目的和职责。

对于这种情况(一种模式),通常建议的解决方案是什么?您能否提供一些比我找到的这两个链接更具描述性的参考资料?

http://publib.boulder.ibm.com/infocenter/esbsoa/wesbv7r5/index.jsp?topic=%2Fcom.ibm.websphere.wesb.programming.doc%2Ftopics%2Fesbprog_patterns.html

https://www.ibm.com/developerworks/wikis/display/esbpatterns/File+Processing

编辑 另一个参考: http://www.ibm.com/developerworks/webservices/library/ws-largemessaging/

【问题讨论】:

    标签: integration esb integration-patterns


    【解决方案1】:

    记住 SOA 中有 3 种消息类型:命令、事件、文档

    “文档”位用于数据块。它可能更适合“订单”或“发票”等“真实”文档类型,但没有什么能阻止您使用“TransactionBatch”。

    话虽如此,它是一种相当未使用的消息类型,因为实际上并没有多少服务总线围绕它实现任何东西,因为:

    • 你真的不需要它
    • 许多消息队列技术对消息大小有限制(低至 4kb),因此难以传输任何大消息(需要分块发送)

    所以在你的场景中我会做的是有一个处理文件的端点。所以像ProcessTransactionFileCommand 这样的东西被发送到处理端点,在其中你只有一个对实际文件的引用(存储在文件系统中的某个地方,甚至是一个可供下载的 URL)。该处理端点可以处理文件并将单个消息(全部在事务中)发送到将消息发送到外部系统的集成端点。你可以有一个SendTransactionCommand 来做到这一点。

    通过这种方式,您的系统非常灵活,因为集成端点可以接收来自解决方案的一些部分的单个集成命令,而处理端点可以处理批处理并将它们拆分为单个集成命令。

    如果你在 .NET 领域,你可能想看看我的 FOSS 服务总线项目:http://shuttle.codeplex.com/

    但任何服务总线都可以解决问题(MassTransit、NServiceBus 等)

    【讨论】:

    • 感谢您的回答。我想,要让您的解决方案在集群上运行,它需要一个共享磁盘?我们没有一个可供我们使用 :-(!(,这就是为什么我们正在考虑将文件分解(分解为单个消息)。但是我们无法就这种拆分是由 ESB 完成还是由另一个外部完成(适配器)应用程序。
    • 顺便说一句,一些 ESB 提供流式传输只是为了处理大文件。但是我们的 ESB(IBM ESB 7.5)不支持它。但是我故意一般地提出了我的问题,与任何特定的 ESB 无关。为了得到一个“建筑学”的答案。
    • Yip:它需要网络共享。如果您查看具有 4kb 限制且文件很大的队列,那真的会很麻烦。不能从源上传到云端再发送处理消息吗?然后端点可以下载文件。
    • 你的意思是通过FTP下载文件?我们尝试了 (IBM) ESB 中内置的 FTP 适配器,但我们遇到了可靠性问题。但我必须说,我们在开发的早期阶段就尝试过它,所以我们可能没有完全正确地使用它。那时我们对这项技术还没有那么丰富的经验。
    • 好吧,我猜 FTP 是一种方式。您的消息可能包含文件 url,当您开始处理命令消息时,您首先将文件下载到本地存储,然后再从那里处理它。
    【解决方案2】:

    您可以在第一种情况下使用 ESB,我认为这不是反模式。 ESB 的目的还在于将遗留应用程序与其他应用程序集成,这些应用程序像在您的用例中一样创建文件作为输出。

    您可以尝试 Mule ESB。它将允许您使用流式传输(通过文件传输)使用文件,使用称为 DataMapper 的 GUI 将文件的内容映射到所需的输出,最后将这些消息放入 VM 队列中,该队列可以是 ESB 中的持久队列.此队列是事务性的,因此您可以保证从一个文件创建的所有消息都放在 VM 队列上,或者一个都不放在。 然后,您可以从另一个流(实际上在 ESB 中处理的流称为 mule 中的流)读取这些消息中的每一个并处理它们。

    HTH,巴勃罗。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2021-07-25
      • 2021-12-03
      • 2021-06-04
      相关资源
      最近更新 更多