【问题标题】:event-driven microservices id generation事件驱动的微服务 id 生成
【发布时间】:2018-02-15 23:18:08
【问题描述】:

我是微服务的新手。我正在尝试创建一个微服务架构,其中有一个 API 网关应该只接收请求并相应地创建一个事件。然后该事件将被一个微服务拦截,该微服务将所需的数据存储到数据库中。

也许我在设计上犯了一个错误,但我希望在客户端调用 API 网关后,请求会异步进行,并且无法保证数据的一致性。

那么客户端如何知道资源是否已创建以及它的 id 呢?

客户端也应该监听事件吗?

这是正确的架构还是我走错了路?

提前感谢您的 cmets!

注意:我没有使用任何结构化框架。我喜欢它们,但这主要是一个实验,我想保持一切简单。无论如何,如果您的建议涉及 spring 或任何 java 框架,我很乐意。

(编辑)

另一个有趣的点。假设 API 响应是异步的,如果客户端需要插入两个资源(由它们自己的 id 标识)组成的聚合数据,如何通过事件驱动的架构来实现?

【问题讨论】:

  • 我发现了两个与我的问题相关的有趣话题:microservices async operationsAcknowledgement to clients on asynchronous microservice
  • 您可以从两个不同的 PoV 中看到它。要么您的客户端监听事件,但您有点失去异步部分的好处,或者您让您的客户端请求您的网关了解状态和 ID
  • 感谢@DamCx。我也在想,如果我的数据可以聚合,例如: * POST /user * POST /group * POST /usergroup 在第三次调用中,客户端必须指定用户 ID 和组 ID。客户端如何知道 id?

标签: java microservices


【解决方案1】:

在同步调用和异步调用之间有两种选择,后者允许更具弹性的架构,所以如果这是你想要的,那就去吧。

也许我在设计上犯了一个错误,但我希望在客户端调用 API 网关后,请求会异步进行,并且无法保证数据的一致性。

由于调用是异步的,您将拥有eventual consistency

那么客户端如何知道资源是否已创建以及它的 id 呢?

它不知道。我看到两个选择:

  1. 客户端生成 ID,最好是 GUIDs(或任何 无状态 唯一 ID)——这是实现高可扩展性的首选方式。然后,客户端使用服务器返回的GUIDHATEOAS URL 轮询服务器以检查资源的状态。
  2. 客户端在没有预先存在的 ID 的情况下发送请求,但服务器返回一个端点 URL,客户端可以在其中轮询命令状态,可能使用唯一的命令 ID(例如:/commands/1234-abcd-5678-efgh/status);命令执行后,服务器返回创建的资源ID或资源URL(如果有RESTFUL服务/HATEOAS

【讨论】:

  • 谢谢@Constantin 我会努力的,我会告诉你的!
  • 我还没有检查你的解决方案,但它看起来很有意义。谢谢!
【解决方案2】:

事件命令分开。

Events 是过去发生的事情,向服务器发送事件只会以 ok 来响应它已收到。

Commands 是您在需要回复时使用的东西,例如 id,或者当您创建用户并且需要检查电子邮件是否已在使用时。然后该命令发送一个带有用户信息的事件“usercreated”,并将用户的 id 返回给运行该命令的人(例如前端客户端)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 2021-04-17
    • 2021-02-03
    • 2019-11-26
    • 2017-09-03
    • 2018-05-13
    • 2021-03-07
    • 2023-01-02
    相关资源
    最近更新 更多