0

我有一个基于 Azure 云服务的 HTTP API,它目前从 Azure SQL 数据库中提供数据。我们在 WebRole 端也有一个角色缓存。

一般来说,这个模型对我们来说工作得很好,但有时发生的情况是我们在很短的时间内收到了大量对同一资源的请求,如果缓存中没有该资源,所有请求都直接发送到我们的DB 对我们来说是个问题,因为 DB 无法承受那么多负载。

从问题的性质来看,它似乎应该是大多数构建 API 的人都会面临的一个非常普遍的问题。我在想,如果以某种方式,我只能向 DB 发送第一个请求并保留所有剩余的请求,直到第一个请求完成,以控制流向 DB 的负载,但我确实做得很好。在 Azure/IIS 中是否有任何标准/推荐的方法?

4

1 回答 1

0

我们处理这种情况的方式是将对数据库的调用放在锁定语句中。这样,只有一个调用者会访问数据库。这是您可以尝试的伪代码:

        var cachedItem = ReadFromCache();
        if (cachedItem != null)
        {
            return cachedItem;
        }
        lock(object)
        {
            cachedItem = ReadFromCache();
            if (cachedItem != null)
            {
                return cachedItem;
            }
            var itemsFromDB = ReadFromDB();
            putItemsInCache(itemsFromDB);
            reurn itemsFromDB;
        }
于 2014-08-25T06:59:07.817 回答