微服务 API 设计。维护有状态上下文

Microservices API design. Maintain stateful context

想象一下密码恢复过程,它包括三个步骤:

  1. 发送短信。用户输入 phone。发送带有确认码的短信。我们 必须限制用户在一段时间内可以执行此操作的次数 要求。
  2. 输入短信代码。用户输入确认码。我们必须 限制尝试次数。
  3. 设置新密码。

此外,我们必须确保这些步骤的顺序正确。这意味着用户不能在前两步不成功的情况下直接跳到第 3 步。


假设我们有简单的架构:
实现三个 API 方法的网关和登录服务,每个方法对应于每个密码恢复步骤过程。

问题是: 哪种服务必须实施这种状态限制?网关或登录服务?

它应该是网关,它将跟踪失败尝试的次数和其他上下文。这使得登录服务无状态。
或者可能是登录服务,所以如果体系结构发展并且会有另一个网关,则无需在另一个网关中复制相同的代码。

在我看来,状态既不应该存储在登录也不应该存储在网关中,这两个服务都必须是无状态的,这样它们才能被扩展。此信息必须位于必须由登录服务查询的数据存储中。 因为这是一个登录过程,所以负责与登录相关的所有操作的必须是登录服务,它需要通过存储例如 login_status 变量来跟踪每个用户在整个登录过程中的位置。 这样您就可以知道特定用户是否正在等待接收短信,或是否正在等待将代码输入系统或此用户已进行的尝试次数。

网关必须完全不知道其背后服务的业务逻辑。它的职责只是成为一个独特的访问点