design-patterns - 微服务之间的数据共享

标签 design-patterns architecture microservices aws-api-gateway data-sharing

当前体系结构:

enter image description here

问题:

前端层和后端层之间有两步流程。

  • 第一步:
    前端在微服务1(MS1)
  • 上验证用户的输入 I1
  • 第二步:
    前端将 I1 和更多信息提交给微服务2

  • 微服务2(MS2)需要验证 I1 的完整性,因为它来自前端。如何避免对MS1的新查询?最好的方法是什么?

    我正在尝试优化的流程除去了步骤1.3和2.3

    流程1:
  • 1.1用户X向MS2
  • 请求数据(MS2_Data)
  • 1.2用户X将数据(MS2_Data + MS1_Data)持久存储在MS1
  • 1.3 MS1使用B2B HTTP请求
  • 检查MS2_Data的完整性
  • 1.4 MS1使用MS2_Data和MS1_Data来持久化数据库1并建立HTTP响应。

  • 流程2:
  • 2.1用户X已经在本地/ session 存储
  • 中存储了数据(MS2_Data)
  • 2.2用户X将数据(MS2_Data + MS1_Data)持久存储在MS1
  • 2.3 MS1使用B2B HTTP请求
  • 检查MS2_Data的完整性
  • 2.4 MS1使用MS2_Data和MS1_Data来持久化数据库1并建立HTTP响应。

  • 方法

    一种可能的方法是在MS2和MS1之间使用B2B HTTP请求,但是我们将在第一步中复制验证。
    另一种方法是将数据从MS1复制到MS2。但是,由于数据量及其易变性,这是禁止的。复制似乎不是一个可行的选择。

    我认为一个更合适的解决方案是前端将负责在微服务2上获取微服务1所需的所有信息,并将其传递给微服务2。这将避免所有此类B2B HTTP请求。

    问题是微服务1如何信​​任前端发送的信息。也许使用JWT以某种方式签署来自微服务1和微服务2的数据将能够验证该消息。

    注意
    每当微服务2需要来自微服务1的信息时,都会执行B2B http请求。 (HTTP请求使用ETAGCache Control: max-age)。如何避免这种情况?

    体系结构目标

    enter image description here

    微服务1需要按需来自微服务2的数据,以便能够将MS1_Data和MS2_Data持久存储在MS1数据库上,因此,使用代理的ASYNC方法不适用于此处。

    我的问题是是否存在一种设计模式,最佳实践或框架来实现这种推力沟通。

    当前体系结构的缺点是每个微服务之间执行的B2B HTTP请求数。即使我使用缓存控制机制,每个微服务的响应时间也会受到影响。每个微服务的响应时间至关重要。此处的目标是归档更好的性能,以及一些如何使用前端作为网关在多个微服务之间分发数据的方法,但使用推力通信

    MS2_Data只是实体SID,例如产品SID或供应商SID,MS1必须使用它来维护数据完整性。

    可能的解决方案

    enter image description here

    这个想法是将网关用作api网关请求处理,该请求将缓存来自MS1和MS2的一些HTTP响应,并将它们用作对MS2 SDK和MS1 SDK的响应。这样,在MS1和MS2之间不直接进行通信(SYNC或ASYNC),也避免了数据重复。

    当然,以上解决方案仅适用于跨微服务的共享UUID / GUID。对于完整数据,事件总线用于以异步方式(事件源模式)在微服务之间分发事件和数据。

    灵感:https://aws.amazon.com/api-gateway/https://getkong.org/

    相关问题和文档:
  • How to sync the database with the microservices (and the new one)?
  • https://auth0.com/blog/introduction-to-microservices-part-4-dependencies/
  • Transactions across REST microservices?
  • https://en.wikipedia.org/wiki/Two-phase_commit_protocol
  • http://ws-rest.org/2014/sites/default/files/wsrest2014_submission_7.pdf
  • https://www.tigerteam.dk/2014/micro-services-its-not-only-the-size-that-matters-its-also-how-you-use-them-part-1/
  • 最佳答案

    从问题和评论中,我了解到您正在尝试重新排列这些块以增强系统性能。如示意图所示,您建议网关先查询microservice2,再查询microservice1,而不是查询microservice2,然后再向microservice1提供来自microservice2的信息。

    因此,我没有看到这将如何显着提高系统性能,但是这种改变似乎只是在改变逻辑。

    为了解决这种情况,应提高关键微服务2的性能。可以通过分析和优化microservice2软件(垂直扩展)来完成此操作,并且/或者可以引入负载平衡(水平扩展)并在多台服务器上执行microservice2。在这种情况下要使用的设计模式是Service Load Balancing pattern

    关于design-patterns - 微服务之间的数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640621/

    相关文章:

    oop - 我应该如何组织一堆单独使用的功能?

    c# - API 设计 : Expose XML or Objects #2

    java - 我应该总是从数据库中检索完整的对象吗?

    java - 即使我输入了 "prefer-ip-address: true",Eureka 服务也总是使用主机名注册实例

    apache-kafka - 在序列/类图中将消费/生产事件表示为从微服务到消息队列[Kafka]的UML组件

    design-patterns - 我使用什么设计模式?

    Mysql数据库设计一张表多键值行性能如何?

    c++ - 两步对象破坏背后的原因是什么?

    architecture - 在 Azure 上托管托管应用程序

    domain-driven-design - 微服务之间基于事件的通信没有共享事件库?