WSO2 ESB 5 如何在单序列中并行调用两个车险查询Endpoint
WSO2 ESB 5 双车险接口并行比价的实现方案
单序列内并行调用双Endpoint的核心实现
WSO2 ESB 5原生支持消息分叉-聚合的原语能力,不需要额外开发自定义组件,即可在单个序列内完成同一份入参并行调用两个外部接口、聚合返回结果的逻辑,核心组合是clone Mediator + aggregate Mediator,具体配置步骤如下:
- 预先定义两个独立的可复用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>
- 在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
相关产品推荐
相关产品推荐

