有一个资源(S1),每次初始化需要花费(T1)的时间。现在的做法很简单,后台首次启动的情况下,会异步初始化(N)个可用的(S1)放在redis队列(Q1)中。每次用户开始请求(S1)时,简单的从队列(Q1)中取一个(S1)返回给用户,同时后台会判断如果队列里可用资源长度小于(M)时会异步生成一个新的(S1)放进队列(Q1)中。但是这样的方案有问题:
- 如果获取资源的速度过快(并发高),会导致资源(S1)还没有初始化完成就返回给用户了,这肯定是不行的,因为有些属性必须是(S1)初始化完成的情况下才能获取。
针对问题1, 想过使用两个队列进行解决,开始初始化(S1)时,将(S1)push到队列(Q1)中,等(S1)初始化完成推送到(Q2)中,每次取都从(Q2)中获取。但是这样还是存在一些问题...
- 此类问题应该是很常见的,奈何知识有限想不到其他什么更好的办法?大家有更好的建议吗?