mongodb - 如何为微服务堆栈构建一个简单但可靠的API预付费信用体系?

标签 mongodb spring-boot api redis microservices

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

例如:通过作业端点 /jobs 创建包含 n 个任务的作业应花费 n * job_creation_credit_cost 个积分。因此,不能仅通过在所有微服务前面跟踪 API 网关内的 http 调用来完成此任务。

我们希望在每个微服务中根据用户 ID 或 client_id(我们使用带有 OIDC 和 JWT token 的 OAuth2)进行某种获取,返回用户是否有足够的积分执行该操作,如果是,则获得该操作所需的积分。

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

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

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

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

那么您将如何构建这样的信用/平衡系统?也许您还了解一些开源解决方案或示例?

最佳答案

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

关于mongodb - 如何为微服务堆栈构建一个简单但可靠的API预付费信用体系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59857364/

相关文章:

api - Bing 图像搜索 API 返回重复结果

node.js - 在 Node 中重用 MongoDB 连接

mongodb - Go mgo 不存储对象

java - Spring Boot 应用程序无法实例化类,除非使用 Autowired 注解

mysql - SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException : could not extract ResultSet

javascript - Ajax API 请求返回 400 和 Base64 图像数据

node.js - Meteor - collection.find() 总是返回所有字段

mongodb - 为什么我的 req.user 在旧版 Chrome 上没有保存?

java - 从Main迁移到Gradle时未发现主类错误

java - API证书不受浏览器信任,我该怎么办?