我有一个基于Azure Cloud Service的HTTP API,它目前正在从Azure SQL数据库中提供数据。我们在WebRole方面也有一个角色缓存。
通常这个模型对我们来说很好,但有时发生的事情是我们在短时间内获得了大量相同资源的请求,如果该资源不在缓存中,那么所有请求都去了直接到我们的DB这对我们来说是一个问题,因为很多时候DB不能承担那么多的负载。
通过查看问题的性质,似乎应该是大多数人构建API所面临的一个非常常见的问题。我想在某种程度上,我只能向DB发送第一个请求,并保留所有剩余的,直到第一个完成时,控制负载进入DB,但我确实做得很好。在Azure / IIS中是否有任何标准/推荐的方法?
答案 0 :(得分:0)
我们处理这种情况的方式是在锁定语句中调用DB。这样只有一个来电者会打到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;
}