【发布时间】:2017-05-29 04:19:35
【问题描述】:
当前架构:
问题:
我们在前端层和后端层之间有一个两步流程。
- 第一步: 前端验证来自用户在微服务 1 (MS1) 上的输入 I1
- 第二步: 前端向微服务提交I1等信息2
微服务 2 (MS2) 需要验证来自前端的 I1 的完整性。如何避免对 MS1 的新查询?最好的方法是什么?
我正在尝试优化的流程移除步骤 1.3 和 2.3
流程一:
- 1.1 用户X向MS2请求数据(MS2_Data)
- 1.2 用户 X 在 MS1 上持久化数据(MS2_Data + MS1_Data)
- 1.3 MS1 使用 B2B HTTP 请求检查 MS2_Data 的完整性
- 1.4 MS1 使用 MS2_Data 和 MS1_Data 持久化数据库 1 并构建 HTTP 响应。
流程2:
- 2.1 用户 X 已经有数据 (MS2_Data) 存储在本地/会话存储中
- 2.2 用户 X 在 MS1 上持久化数据(MS2_Data + MS1_Data)
- 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 请求使用ETAG 和Cache Control: max-age)。如何避免这种情况?
架构目标
微服务 1 需要来自微服务 2 的按需数据,才能将 MS1_Data 和 MS2_Data 持久化到 MS1 数据库中,因此使用代理的 ASYNC 方法在这里不适用。
我的问题是是否存在设计模式、最佳实践或框架来实现这种推力通信。
当前架构的缺点是每个微服务之间执行的 B2B HTTP 请求的数量。即使我使用缓存控制机制,每个微服务的响应时间也会受到影响。每个微服务的响应时间都很关键。这里的目标是存档更好的性能,以及如何使用前端作为网关在多个微服务之间分发数据,但使用推力通信。
MS2_Data 只是一个实体 SID,如产品 SID 或供应商 SID,MS1 必须使用它来维护数据完整性。
可能的解决方案
这个想法是将网关用作 api 网关请求处理,它将缓存来自 MS1 和 MS2 的一些 HTTP 响应,并将它们用作对 MS2 SDK 和 MS1 SDK 的响应。这样 MS1 和 MS2 之间不会直接进行通信(SYNC OR 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/
【问题讨论】:
-
当前解决方案的缺点是什么?它更简单,每个服务只需返回请求的数据,而不必进入消息身份验证业务。
-
缺点是每个微服务之间执行的 B2B HTTP 请求的数量。即使我使用缓存控制机制,每个微服务的响应时间也会受到影响。每个微服务的响应时间至关重要。这里的目标是归档更好的性能,以及如何使用前端作为网关在多个微服务之间分发数据,但使用推力通信。 @dbugger 你怎么看?
-
我看不出你是如何减少整体流量的,你只是重新安排它并添加加密的复杂性。
-
你能用特定领域的术语描述插图组件的动态行为吗?例如。 “用户 X 查询配置文件数据,需要同时查询服务 A 和 B”。因为目前还不清楚这些 b2b 请求是关于什么的。
-
@IlliakaillI 我更新了这个问题,提供了有关我当前架构和我要归档的内容的更多详细信息。请查看流程部分。
标签: design-patterns architecture microservices aws-api-gateway data-sharing