我在想,如果已经有一个图书馆这样做,或者一个建议,去下面的问题,其办法:Golang检测飞行要求
客户端A使得对资源的请求,这是一个漫长运行请求,因为资源A很昂贵并且导致缓存未命中。与此同时,客户端B请求资源A,现在它仍然是缓存未命中,因为客户端A的请求尚未返回并填充缓存。所以客户端B应该阻塞并在客户端A的请求完成并且已经填充了缓存时通知客户端B,而不是发出新请求来生成资源A.
我认为组缓存库具有这些内容,但我无法浏览代码来弄清楚它们是如何实现的,我也不想将实现与它联系起来并使用它作为依赖。
我到目前为止唯一的解决方案是一个pub-sub类型的事物,我们有一个以reqID作为关键字的当前正在进行的请求的全局映射。当req1到达时,它在地图中设置它的ID,req2到来并检查它的id是否在地图中,因为它请求相同的资源,所以我们阻塞在通知器通道上。当REQ1完成它的三件事:
- 从地图
- 逐出其ID保存在高速缓存中
- 条目发送广播其ID到通知信道 REQ2接收到该通知,解除阻塞和从缓存中提取。
因为go没有内置的广播支持,所以可能有1个灌注监听广播频道,然后保留一个订户列表来广播每个请求,或者我们可以将地图更改为reqId = > list(broadcastChannelSubscribers)。沿着这些线的东西。
如果您认为有更好的方法来处理Go的基元,任何输入将不胜感激。唯一让我困扰的解决方案就是这张全球地图,被锁定环绕,我认为它很快会成为一个瓶颈。如果你有一些非锁定的想法,即使他们是概率性的,我很乐意听到他们的意见。
似乎几乎相同,在我的情况下,因为请求是相当重的锁概率不会是瓶颈,我只是想知道是否有一个很好的锁免费的方式做到这一点 – Feras