如何在CQRS系统中正确进行一次性查询?

How to properly make one-off queries in CQRS system?

我有一个系统可以通过访问令牌访问资源集。因此,当客户端需要访问某些特定资源时,他们会请求令牌(一个资源 - 一个令牌)。我需要做一次性的(或者至少是限时的)token,保证即使token泄露了,也能很快失效。

在基于 CQRS 的系统中实现该目标的正确方法是什么?查询资源不应更改系统状态。换句话说 - 我们不能在查询处理程序中使令牌无效。我们可以吗?

这些是不同的关注点。我会做什么:

  1. 边缘检查授权(使用提供的令牌)和 调用查询处理程序,连同 query/token 信息
  2. 查询returns结果
  3. 边缘发布事件"TokenHasBeenUsed"
  4. 边缘returns查询结果
  5. 令牌提供者使用事件并使令牌无效。

您还可以构建它的调度,如果不使用一段时间后令牌将失效。另外,您还可以有一个使用计数器或其他东西,它不需要混合到边缘或查询处理程序。