【问题标题】:Mule ASYNC scope vs VMMule ASYNC 范围与 VM
【发布时间】:2014-10-07 10:24:15
【问题描述】:

有人可以帮我理解 mule 中异步作用域和 vm 之间的区别。我知道 vm 就像在内存 JMS 中一样,但是如果我的要求是异步处理某些东西,我可以随意使用它们中的任何一个吗?如果不是,有什么区别。

例如,以下可能有什么区别:

主流程 1 使用异步范围调用另一个流程:

<flow name="mainflow1">
...
<async>
  <flow-ref name="anotherflow" /> 
</async>
...
</flow>

主流程2使用VM调用另一个流程:

<flow name="mainflow2">
...
<outbound-endpoint address="vm://anotherflow" exchange-pattern="one-way" />
..
</flow>

假设另一个流向某个数据库写入一条记录,并且不是请求-响应类型。那么线程安全性如何。两者都是完整的线程安全的吗?

【问题讨论】:

    标签: asynchronous mule


    【解决方案1】:

    马特的回答是正确的。我可能会为您添加一些额外的好处,因为通过队列而不是仅仅调用另一个流的额外成本:

    1. 使用 VM 出站端点(或者实际上是任何队列)使您能够在临时高负载下对消息进行排队,并控制在消息多于目标流可以消耗时发生的情况(最大未完成消息,达到最大值时该怎么做,在出错之前等待发布成功的时间等)。这就是SEDA的目的。

    2. 在消费者端,使用队列而不是流引用允许您使用事务来确保您不会使用消息,除非您的预期处理成功。

    3. VM 队列提供了一个方便的地方来单独测试应用程序的各个部分。您可以在功能测试中使用 MuleClient 从 VM 队列发送或接收消息,以确保您的流程正常工作。

    【讨论】:

    • 感谢 Ryan 和 Matt 的解释。想一想,这让我明白了。不过,我有一些后续查询……从马特的观点来看,我知道使用 VM 会产生一些额外的开销。但是线程安全性如何。使用异步时,我遇到了获取 ConcurrentModificationException 的问题。当我将其更改为使用 VM 时,我看不到这些错误。我最初的问题是link。如果您建议通过该链接提供答案,我可以在这里接受您的答案。
    【解决方案2】:

    两者之间的主要区别在于流程的上下文。使用 vm 端点时,mule 将消息视为全新的传入消息。它有一个全新的上下文和独立的属性和变量。如果要从调用流继承属性和变量,可以使用 flow-ref 来调用流或子流(请参阅此处了解流和子流之间的区别:http://www.mulesoft.org/documentation/display/current/Flows+and+Subflows)。由于 vm 端点创建了一个新的上下文,调用中有更多的开销并且效率较低,但是有了额外的开销,您可以获得进行完整的 mule 调用所带来的所有基础设施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多