You need to enable JavaScript to run this app. WSO2 ESB 5 如何在单序列中并行调用两个车险查询Endpoint
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 ESB 5 如何在单序列中并行调用两个车险查询Endpoint

WSO2 ESB 5 双车险接口并行比价的实现方案

单序列内并行调用双Endpoint的核心实现

WSO2 ESB 5原生支持消息分叉-聚合的原语能力,不需要额外开发自定义组件,即可在单个序列内完成同一份入参并行调用两个外部接口、聚合返回结果的逻辑,核心组合是clone Mediator + aggregate Mediator,具体配置步骤如下:

  1. 预先定义两个独立的可复用Endpoint,分别指向两家车险公司的报价接口,配置好独立的超时、重试规则:
<endpoint name="company1QuoteEP">
  <address uri="https://api.car-insurance-company-1.com/quote" format="json"/>
</endpoint>
<endpoint name="company2QuoteEP">
  <address uri="https://api.car-insurance-company-2.com/quote" format="json"/>
</endpoint>
  1. 在API资源/代理服务绑定的处理序列中,直接嵌入并行分叉和聚合逻辑,不需要拆分多个子序列:
<sequence name="insuranceQuoteCompareSeq">
  <!-- 移除默认的无实体体属性,保证客户端传入的JSON入参可正常透传 -->
  <property name="NO_ENTITY_BODY" action="remove" scope="default"/>

  <!-- 并行分叉:复制当前消息为2个独立分支,非串行执行 -->
  <clone sequential="false">
    <!-- 分支1:透传入参调用公司1接口 -->
    <target>
      <sequence>
        <send>
          <endpoint key="company1QuoteEP"/>
        </send>
      </sequence>
    </target>
    <!-- 分支2:透传入参调用公司2接口 -->
    <target>
      <sequence>
        <send>
          <endpoint key="company2QuoteEP"/>
        </send>
      </sequence>
    </target>
  </clone>

  <!-- 聚合所有分支的响应 -->
  <aggregate completionCondition="OR">
    <!-- 收集到2个分支的响应后触发聚合逻辑 -->
    <correlateOn expression="get-property('MessageID')"/>
    <onComplete expression="json-eval($.)">
      <!-- 把两个公司的原始报价响应拼成指定的聚合结构 -->
      <script language="js">
        const company1Res = mc.getPayloadJSON()[0];
        const company2Res = mc.getPayloadJSON()[1];
        mc.setPayloadJSON([
          {"company":"company1", "price": company1Res.price},
          {"company":"company2", "price": company2Res.price}
        ]);
      </script>
      <!-- 直接把聚合结果返回给客户端 -->
      <respond/>
    </onComplete>
  </aggregate>
</sequence>

配置关键注意点

  • clone节点必须手动设置sequential="false",默认值是true,不改的话两个接口会被串行调用,总响应时间为两个接口耗时之和,完全达不到并行提效的目的。
  • 两个send分支不需要单独配置接收逻辑,clone生成的分支会自动继承父消息的上下文ID,aggregate节点可以自动完成分支关联,不需要额外编写复杂的匹配规则。
  • 给每个Endpoint配置3s以内的独立超时阈值,避免单家接口故障导致整体服务长时间阻塞,超时后的错误响应可以在聚合逻辑中做兜底转换,比如替换为“暂无可匹配报价”的默认值,不影响整体结果返回。

其他可落地的替代实现方案

  • 基于非阻塞Call Mediator的扁平结构实现。在序列中连续配置两个带blocking="false"属性的Call节点,分别指向两个保险公司Endpoint,后续直接衔接aggregate节点收集响应。相比clone方案,代码结构更扁平,不需要嵌套多层target节点,适合固定对接两家接口、后续很少新增对接方的场景。
  • 基于Iterate Mediator的动态批量并行调用实现。把所有对接的保险公司Endpoint维护成可配置的列表,通过iterate节点按照列表长度将单条入参拆分为对应数量的并行分支,后续新增第三家、第四家保险公司接口时,仅需在配置列表中新增对应Endpoint地址,不需要修改核心序列逻辑。适合长期需要扩展对接多家车险公司的场景。
  • 基于内部缓存的结果聚合实现。两个接口的响应先写入ESB的内部消息缓存,客户端请求时优先读取缓存中的结果,没有缓存则触发后台并行调用、待响应全部返回后再推送给客户端。适合接口平均响应时间较长、客户端可接受短等待的大流量场景。

内容的提问来源于stack exchange,提问作者wso2isbest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 17:27:03