首页 > 解决方案 > 如何为微服务堆栈构建一个简单但可靠的 API 预付信用系统?

问题描述

我们已经构建了一个基于微服务的 API 产品,具有许多不同的 REST 端点。api 客户应该根据他对不同端点的使用收取不同的费用。我们主要使用 spring-boot 来提供我们的服务,并在 kubernetes 集群中使用一些 netflix-oss 组件。

例如:n通过作业端点创建带有任务的作业/jobs应该花费n * job_creation_credit_cost积分。因此,仅通过在所有微服务前面跟踪我们的 API 网关中的 http 调用是无法做到的。

我们希望acquire在每个微服务中都有某种类型,基于用户 id 或 client_id(我们使用带有 OIDC 和 JWT 令牌的 OAuth2)返回用户是否有足够的积分来执行操作,如果是,则获取所需的积分对于这个动作。

由于我们处于自动访问的 api 上下文中,因此可能会有数千个并行请求。所以获取步骤需要很快。如果之后某个作业失败(我们无法执行该作业),也应该可以退还积分。

我对整个事情有一些想法,并考虑构建一个中央微服务,负责信用/审计,并为每个客户保存当前的信用余额。该服务应该有一些用于获取的 REST 端点,以及与 RabbitMQ 等消息代理的连接(因为我们已经在内部使用它)。

现在每个服务job-service都可以credit-service通过 http(所有可能的操作)或消息代理(仅用于收费,而不是要求获取)来调用。这个信用服务应该连接到一个 mongodb,也可能是一个作为缓存层的 redis,以提高一些可能的操作的性能,以便 http 端点可以尽快响应(因为我们阻止了客户的请求)。

还有一点要考虑的是,如果我们对某些余额有很多并发读/写以及 http 协议的使用,可能会在 mongodb 上下文中发生乐观锁定异常。也许http太慢了,我们应该使用不同的东西。

那么你将如何建立这样的信用/余额系统呢?也许您还知道一些开源解决方案或示例?

标签: mongodbspring-bootapiredismicroservices

解决方案


听起来很像您正在尝试开发分布式分类帐或令牌袋类型的应用程序。正如你所说,我会使用一项服务来获取令牌,然后通过某种消息队列进行异步,你可以在带外统计使用的令牌。如果你想让令牌过期,你可以通过在使用令牌时提醒提供服务的计数服务来做到这一点,尽管我敢打赌有很多方法可以做到过期(如果这甚至是一个要求)


推荐阅读