ESB 可以操纵响应吗?

Can an ESB manipulate the response?

如果我有这样的结构:

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

对服务 1 和 2 的调用是并行的。 ESB 是否能够:

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

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

  1. 动态路由器 EIP:此模式允许您动态计算一个或多个端点以将消息发送到。通常,端点按顺序调用,即一次调用一个,因此通常不会并行处理。
  2. 多播EIP:这里有一个静态的端点列表,你将调用。然后一次发送一条消息或并行发送消息(取决于实现软件)。收件人列表是静态的。
  3. 收件人List:Very类似于多播这个EIP允许您动态计算端点的收件人列表,然后并行发送或一次发送一个(取决于实现)。

等待两个响应返回通常称为您的聚合策略。该策略将指定当一个端点发生故障等时要执行的操作。例如,向端点 A 和 B 发送一条超时为 30 秒的消息。如果超时,则 return 错误或 return 部分响应。

关于操纵响应,这也是 ESB 的典型用法。有消息翻译器和内容丰富器等 EIP 模式。再说一次,这些可能是也可能不是您要找的。

像您刚才描述的那样设计服务时要牢记的一件重要事情是将 ESB 上的服务抽象到客户端发出的请求没有 service_! service_2 具体在里面。让我用一个例子来说明这一点。

假设我们有以下场景,您正在托管酒店预订服务。每次用户使用此服务时,您都希望用一定数量的积分奖励用户(奖励计划)。为简单起见,您将在 ESB 上将两项服务(酒店预订服务和奖励服务)合并为一项服务。

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

  • 客人全名
  • 到达日期
  • 出发日期
  • 房间号
  • 预订服务用户名和密码(即授权调用预订服务的 ESB 服务用户)。

使用奖励服务的要求是:

  • 注册奖励系统用户名。

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

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

此服务仅公开进行预订所需的元素,因此用户不会受到后端更改的影响。永远记住这一点。尽可能保护您的服务消费者免受服务提供商的技术细节的影响。因此,如果您收到此类请求,您将丰富发送到 ESB 上的提供者的消息,等待聚合完成并发送响应。

如果您的提供商发生变化,影响很小。当您在 SOA 中正确理解这些概念时,您就可以顺利地获得收益。