【问题标题】:Managing an array data structure with concurrent API requests使用并发 API 请求管理数组数据结构
【发布时间】:2023-03-12 19:39:02
【问题描述】:

我有一个节点后端 REST API,它将被部署为多个容器。

我有一个用户数组 = ['u1', 'u2', 'u3', 'u4'] 可以存储在 mongoDb 或 redis 中

我有一个 get 端点,可以从这个数组中返回下一个用户。

例如:第一个请求应该返回 u1,第二个请求应该返回 u2,第五个请求应该返回 u1。

一旦这个 API 被部署为多个容器,假设有 10 个容器在运行并且同时发出 10 个请求,我如何确保它们按顺序返回。

我正在寻找一种标准方法来处理这种情况。以下是我想到的一种方法

将数组作为列表存储在 redis 上。

对每个请求执行 LPOP 和 RPUSH,这样第一个请求之后的列表就是

['u2', 'u3', 'u4', u1]

这里需要注意的是,如果 5 个请求并行出现,可能会出现执行 5LPOP 的情况 并且数组可能为空,RPUSH 可能会乱序执行。

处理此问题的最佳方法是什么?

【问题讨论】:

    标签: node.js concurrency microservices


    【解决方案1】:

    在 Redis 中,您需要使用 MULTI 来获得类似事务的行为

    "一个事务中的所有命令都被序列化并执行 依次。永远不会发生另一个人发出的请求 客户端在 Redis 执行过程中提供服务 交易。这保证了命令作为 单一隔离操作”https://redis.io/topics/transactions

    请注意,Redis 事务并不意味着严格的可串行化,请参阅https://jepsen.io/analyses/redis-raft-1b3fbf6

    【讨论】:

    • 感谢阿农。如果两个不同的客户端同时发出两个 MULTI 事务。这是如何表现的?一个客户端将被执行,第二个客户端事务将排队,直到第一个客户端的命令完成?
    • 假设两者都尝试更改相同的键,第二个键将失败(因为它产生的原始值不再有效) - 假设您有 100 美元的余额并且您有 2 个请求提取 100 美元- 您需要考虑是否真的希望通过第二个请求,因为最初的意图(获得 0$ 余额)不再正确(但如果您愿意,您可以重新提交并获得 -100$)(只是一个例子 - 我不会在 Redis 上经营我的银行 :))
    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 2018-07-10
    • 2020-01-31
    • 2018-04-24
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多