在Azure/IIS WebRole中处理大量相同的请求

在Azure/IIS WebRole中处理大量相同的请求,iis,azure,webrole,Iis,Azure,Webrole,我有一个基于Azure云服务的HTTP API,它目前正在Azure SQL数据库中提供数据。我们在WebRole端还有一个角色内缓存 一般来说,这个模型对我们来说运行良好,但有时我们会在短时间内收到大量对同一资源的请求,如果该资源不在缓存中,所有请求都会直接发送到我们的数据库,这对我们来说是个问题,因为很多时候数据库无法承担那么多负载 从问题的本质来看,这似乎应该是大多数构建API的人都会面临的一个非常常见的问题。我在想,如果某种程度上,我只能向DB发送第一个请求,并保留所有剩余的请求,直到第

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

一般来说,这个模型对我们来说运行良好,但有时我们会在短时间内收到大量对同一资源的请求,如果该资源不在缓存中,所有请求都会直接发送到我们的数据库,这对我们来说是个问题,因为很多时候数据库无法承担那么多负载


从问题的本质来看,这似乎应该是大多数构建API的人都会面临的一个非常常见的问题。我在想,如果某种程度上,我只能向DB发送第一个请求,并保留所有剩余的请求,直到第一个请求完成,以控制加载到DB,但我确实从中得到了好处。在Azure/IIS中有什么标准/推荐的方法吗?

我们处理这种情况的方法是将对DB的调用放在lock语句中。这样,只有一个调用者会点击数据库。以下是您可以尝试的伪代码:

        var cachedItem = ReadFromCache();
        if (cachedItem != null)
        {
            return cachedItem;
        }
        lock(object)
        {
            cachedItem = ReadFromCache();
            if (cachedItem != null)
            {
                return cachedItem;
            }
            var itemsFromDB = ReadFromDB();
            putItemsInCache(itemsFromDB);
            reurn itemsFromDB;
        }

在这么短的时间内,服务器需要多长时间,从SQL db检索资源需要多长时间?比如在5分钟内,我们收到了800个相同资源的请求。此外,本例中的查询从SQL中提取大量数据,因此需要大约6-8秒的时间。但它仅适用于单个实例,不能跨WebRole的多个实例。。。正当你们可以从每个web角色发送一个请求吗?如果缓存是共享的,就不行了。如果缓存是本地的,那么我同意您的看法,但是您的缓存由所有实例共享。对吗?我们的缓存只共享。看来我没有正确解释我上述评论的意思。假设您的服务中运行了3个web角色实例。现在有3个对同一资源的请求同时登录到您的服务上,每个请求都转到3个不同的实例。现在,所有3个实例都将转到DB获取资源,因为您的锁对象没有在WebRole实例之间共享。对吗?我明白了。我同意,如果请求同时命中3个不同实例,上述方法将导致3个DB命中。