nodejs中的并发请求问题api: 100个请求加入竞赛,有1个空缺
Concurrency request problem in nodejs api: 100 request to join contest with 1 vacancy
我在节点 api 上工作,遇到并发请求问题。
pseudo code
1. Get user details along with credit balance.
2. Get contest maxEntry count (1 user = 1 count), total no. user joined contest so far, maxEntryPerUser, and contest entry fee.
3. Compare user credit balance and entry if balance is low then throw error
4. Compare maxEntry and totalJoined, if maxEntry is less or equal to totalJoined then throw error and not allow user to join the contest otherwise allow.
问题1:假设用户有2个credit balance,比赛entryFee为2,maxEntryPerUser为1
用户有信用余额 1,并且用户同时发送了 100 个请求,所有 100 个请求都开始并行处理,100 个中有超过 50 个请求成功处理,即同一用户参加比赛超过 50 次,信用余额较低
预期结果:99 个请求必须失败,只有 1 个请求应该得到成功响应。
问题2:假设maxEntry计数为1
多个用户同时发送了 100 个请求,所有 100 个请求开始并行处理,在 100 个请求中,超过 50 个请求成功处理,即超过 50 个用户参加了比赛,而只允许 1 个条目
预期结果:99 个请求必须失败,只有 1 个请求应该得到成功响应。
这可以很容易地通过 运行 在同一个 REPEATABLE READ
事务中进行检查和数据修改来解决。然后除了一个事务之外的所有事务都会出现序列化错误并且必须重新启动。
如果您预计经常会发生冲突,那么在检查中使用 SELECT ... FOR NO KEY UPDATE
可能会更好,以确保同一时间只有一个检查可以 运行 相同的数据。
我在节点 api 上工作,遇到并发请求问题。
pseudo code
1. Get user details along with credit balance.
2. Get contest maxEntry count (1 user = 1 count), total no. user joined contest so far, maxEntryPerUser, and contest entry fee.
3. Compare user credit balance and entry if balance is low then throw error
4. Compare maxEntry and totalJoined, if maxEntry is less or equal to totalJoined then throw error and not allow user to join the contest otherwise allow.
问题1:假设用户有2个credit balance,比赛entryFee为2,maxEntryPerUser为1
用户有信用余额 1,并且用户同时发送了 100 个请求,所有 100 个请求都开始并行处理,100 个中有超过 50 个请求成功处理,即同一用户参加比赛超过 50 次,信用余额较低 预期结果:99 个请求必须失败,只有 1 个请求应该得到成功响应。
问题2:假设maxEntry计数为1
多个用户同时发送了 100 个请求,所有 100 个请求开始并行处理,在 100 个请求中,超过 50 个请求成功处理,即超过 50 个用户参加了比赛,而只允许 1 个条目 预期结果:99 个请求必须失败,只有 1 个请求应该得到成功响应。
这可以很容易地通过 运行 在同一个 REPEATABLE READ
事务中进行检查和数据修改来解决。然后除了一个事务之外的所有事务都会出现序列化错误并且必须重新启动。
如果您预计经常会发生冲突,那么在检查中使用 SELECT ... FOR NO KEY UPDATE
可能会更好,以确保同一时间只有一个检查可以 运行 相同的数据。