ESB可以操纵响应吗?

时间:2015-01-21 23:36:52

标签: web-services wso2esb soa esb

如果我有这样的结构:

request --> ESB --> Service_1
                --> Service_2

对service1和2的调用是并行的。 ESB是否有能力:

  1. 等到两个回复都回来了?
  2. 操纵响应,例如两个服务都返回一个整数,如2和8.然后ESB计算平均值 - 5并将其发送给用户?

1 个答案:

答案 0 :(得分:1)

答案是肯定的,您可以使用多种SOA设计模式。某些这些模式可能不适合您的用例,因为您的描述在细节上有点稀疏。然而,基于概念设计,我想到了一些模式:

  1. 动态路由器EIP:此模式允许您动态计算一个或多个要发送消息的端点。通常,按顺序调用端点,即一次调用一个端点,因此通常不进行并行处理。
  2. 组播EIP:这里有一个静态的端点列表,您将调用它们。然后,可以一次发送一条消息,也可以并行发送消息(取决于实现软件)。收件人列表虽然是静态的。
  3. 收件人列表:非常类似于多播,此EIP允许您动态计算端点的收件人列表,然后一个或一个地发送(取决于实现)。
  4. 等待两个回复通常被称为聚合策略。此策略将指定当一个端点出现故障时要执行的操作等。例如,向端点A和B发送消息,并且超时为30秒。如果一次超出则返回错误或返回部分响应。

    关于操纵响应,这也是ESB的典型用法。有EIP模式,如消息翻译和内容丰富。这些可能或者可能不是你想要的。

    在设计像您刚刚描述的服务时要记住的一件重要事情是在ESB上抽象您的服务,以至于客户端发出的请求没有service_!和service_2具体在其中。让我用一个例子来澄清这一点。

    假设我们有以下情况您正在主持酒店预订服务。每当用户使用此服务时,您希望以一定的积分奖励用户(奖励计划)。为简单起见,您将在ESB上将两项服务(酒店预订服务和奖励服务)合并为一项服务。

    使用酒店预订服务的要求如下:

    • 访客姓名
    • 抵达日期
    • 出发日期
    • 房号
    • 预订服务用户名和密码(即有权致电预订服务的ESB服务用户)。

    使用奖励服务的要求是:

    • 注册奖励系统用户名。

    您不能指望或想要向用户提供您的预订服务用户名和密码。因此,您不会在ESB上公开该字段。此外,如果您在ESB上公开该字段并且预订服务更改为一次授权代码,那么您在ESB上的服务将不得不改变。

    如果你只暴露:   - 访客全名  - 到达日期  - 出发日期  - 房间号   - 注册奖励系统用户名。

    此服务仅公开预订所需的元素,因此用户与后端的更改隔离。始终牢记这一点。尽可能地保护您的服务使用者免受服务提供商的技术细节的影响。因此,如果您收到此类请求,您将在ESB上丰富上传到您的提供商的消息,等待聚合完成并发送响应。

    如果您的供应商发生变化,影响微乎其微。当您在SOA中获得这些概念时,您就可以获得收益。