繁体   English   中英

面试任务:使用令牌限制并发请求数

[英]Interview task: Limit number of concurrent requests with tokens

在采访中,我得到了这个问题。

场景:在数据库表中,有针对公共资源的条目。 让我们说列名称“令牌”。 总共有500个令牌。 一个Web应用程序正在使用此令牌表。 因此,每当一个用户点击Web应用程序URL时,就会将一个令牌分配给该用户。 一旦将令牌分配给用户,其他用户就无法使用它。 因此对于另一个用户,如果令牌显示已经采用,则系统将尝试分配另一个令牌,依此类推。

问题:现在在给定的时间点,让我们说600个用户点击网络应用程序,如何确保只有500个用户将获得令牌,其余100个将不会。

谢谢。

您需要做的是检查请求启动时是否有空闲令牌,如果有空闲令牌则获取令牌,并在工作完成时释放令牌。 由于问题是关于数据库的,我认为它暗示了如何实现检查的原子性并采取 :使用事务。

例如,您可以拥有500行的表,其中包含一个可以从数据库中选择一个空闲令牌的过程,如果有,则更新其行以将其标记为已采用。 此过程将在事务中运行。 如果它没有可用的免费令牌结束,则服务线程将等待并在短时间后再次尝试。 释放令牌再次是对行的简单更新。

另一种选择是从空表开始并通过插入新行来获取令牌。 同样,必须在事务中运行检查<= 500行并插入新行以确保原子性。

如果我正在设计这个,我会设计像堆栈一样的令牌,你把一个令牌关闭/放回去。 如果没有令牌,则等待令牌在堆栈中可用。

就多线程而言,实际的堆栈弹出调用应该在同步块中,因此一次只能有一个线程弹出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM