我有一个基于HTTP API的Azure云服务,它目前从Azure SQL数据库中提供数据。我们在WebRole端也有一个角色缓存。
一般来说,这个模型对我们来说工作得很好,但有时发生的情况是,我们在很短的时间内得到大量对同一资源的请求,如果该资源不在缓存中,所有的请求都直接转到我们的DB,这对我们来说是一个问题,因为很多时候DB无法承受那么多的负载。
从问题的本质来看,这似乎应该是大多数构建API的人都会面临的一个相当普遍的问题。我在想,如果以某种方式,我可以只发送第一个请求到DB,并保持所有剩余的时间,直到第一个完成,以控制负载到DB,但我确实得到了任何好处。在Azure/IIS中有什么标准/推荐的方法吗?
我们处理这种情况的方法是将对DB的调用放在锁语句中。这样只有一个调用者会访问数据库。下面是您可以尝试的伪代码:
var cachedItem = ReadFromCache();
if (cachedItem != null)
{
return cachedItem;
}
lock(object)
{
cachedItem = ReadFromCache();
if (cachedItem != null)
{
return cachedItem;
}
var itemsFromDB = ReadFromDB();
putItemsInCache(itemsFromDB);
reurn itemsFromDB;
}