【问题标题】:nServiceBus with large XML messages带有大型 XML 消息的 nServiceBus
【发布时间】:2011-02-15 11:11:50
【问题描述】:

我已经阅读了真正的消息传递,它不是在总线上发送有效载荷,而是发送一个标识符。在我们的案例中,我们有很多遗留应用程序/服务,它们旨在接收接近 4MB(接近 MSMQ 限制)的消息 (xml) 的有效负载。有没有办法让 nService 总线自动处理大负载和持久化消息或另一种解决方法,这样发布者/订阅者服务就不必担心负载大小,也不必担心如何去/重新水化有效载荷? 提前谢谢你。

【问题讨论】:

    标签: msmq nservicebus


    【解决方案1】:

    您始终可以使用压缩消息的快速“修复”。

    使用二进制序列化器序列化的 POCO 可以大幅度压缩。我们看到我们的消息从 20mb 压缩到 3.1mb。

    因此,如果您的消息徘徊在 4mb 左右,那么只需编写一个 IMessageSerializer 来自动压缩在线上的消息。

    【讨论】:

      【解决方案2】:

      您可以使用Message Sequence 模式。在 NServiceBus 中,您将拆分发送方中的有效负载,将块包装在自定义的“序列”IMessage 中,然后在另一端实现一个 saga 以提取块并重新组装。您需要在错误处理和超时方面付出一些努力。

      【讨论】:

      • 谢谢山姆。那是一种选择。我读的越多,我就越发现,我真的应该将有效负载留在外面,并在需要时查询它。
      • 嗨,肖恩 - 这是一个权衡取舍,具体取决于您的要求。如果您无法忍受您的索赔检查有效负载存储可能已关闭的前景,您将希望使用消息序列。
      • 为什么不将有效负载作为文件写入 FTP 站点,然后使用上传文件的 ID 创建一条消息?
      • @Marco:是的,这就是claim check 模式——正如我所提到的,这涉及到权衡;在大多数情况下,它比消息序列要容易得多,但有更多的活动部分。
      • @sam 我确实知道它有一个模式。谢谢山姆
      【解决方案3】:

      我不知道有任何内部 NServiceBus 功能可以将额外数据与带外消息相关联。

      我认为你是对的 - 如果整个有效负载无法容纳在限制范围内,那么最好将其保存在您自己的其他地方,然后传递一个 ID。

      但是,您可以设计一个消息结构,使一个消息可以实现一个 IHasPayload 接口(可能包含一个 ID 和一个类型?),然后您的应用程序逻辑可以有一个通用的方法来获取给定 IHasPayload 消息的有效负载。

      【讨论】:

      • 谢谢大卫,想到了与此类似的事情,但是您需要另一个子系统来充当存储库(如 DB),并且依赖于该子系统的消息可以启动并运行。这增加了整体解决方案和消息可靠性以及所有相关的复杂性。我希望能找到一些不同的东西(不是奇迹,而是我可能不知道的 nBusService 功能)。
      猜你喜欢
      • 2011-03-14
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多