使用并发 API 请求管理数组数据结构
Managing an array data structure with concurrent API requests
我有一个节点后端 REST API 将部署为多个容器。
我有一个用户数组 = ['u1', 'u2', 'u3', 'u4'] 可以存储在 mongoDb 或 redis
我有一个获取端点,return来自这个数组的下一个用户。
例如:第一个请求应该 return u1,第二个请求应该 return u2,第五个请求 returns u1.
一旦这个 API 被部署为多个容器,假设有 10 个容器 运行 并且同时发出 10 个请求,我如何确保它们被 returned按顺序。
我正在寻找处理这种情况的标准方法。以下是我想到的一个方法
将数组存储为 redis 上的列表。
对每个请求执行 LPOP 和 RPUSH 这样第一个请求之后的列表将是
['u2', 'u3', 'u4', u1]
这里要注意的是,如果5个请求并行进来,可能会出现这样的场景,5个LPOP可以被执行
并且数组可能为空并且 RPUSH 可能被乱序执行。
处理此问题的最佳方法是什么?
在 Redis 中,您需要使用 MULTI 来获得类似事务的行为
"All the commands in a transaction are serialized and executed
sequentially. It can never happen that a request issued by another
client is served in the middle of the execution of a Redis
transaction. This guarantees that the commands are executed as a
single isolated operation" https://redis.io/topics/transactions
请注意,Redis 事务并不意味着严格的可串行性,请参阅 https://jepsen.io/analyses/redis-raft-1b3fbf6
我有一个节点后端 REST API 将部署为多个容器。
我有一个用户数组 = ['u1', 'u2', 'u3', 'u4'] 可以存储在 mongoDb 或 redis
我有一个获取端点,return来自这个数组的下一个用户。
例如:第一个请求应该 return u1,第二个请求应该 return u2,第五个请求 returns u1.
一旦这个 API 被部署为多个容器,假设有 10 个容器 运行 并且同时发出 10 个请求,我如何确保它们被 returned按顺序。
我正在寻找处理这种情况的标准方法。以下是我想到的一个方法
将数组存储为 redis 上的列表。
对每个请求执行 LPOP 和 RPUSH 这样第一个请求之后的列表将是
['u2', 'u3', 'u4', u1]
这里要注意的是,如果5个请求并行进来,可能会出现这样的场景,5个LPOP可以被执行 并且数组可能为空并且 RPUSH 可能被乱序执行。
处理此问题的最佳方法是什么?
在 Redis 中,您需要使用 MULTI 来获得类似事务的行为
"All the commands in a transaction are serialized and executed sequentially. It can never happen that a request issued by another client is served in the middle of the execution of a Redis transaction. This guarantees that the commands are executed as a single isolated operation" https://redis.io/topics/transactions
请注意,Redis 事务并不意味着严格的可串行性,请参阅 https://jepsen.io/analyses/redis-raft-1b3fbf6