代码之家  ›  专栏  ›  技术社区  ›  ila

关于高流量Web服务的提示,c asp.net sql2000

  •  2
  • ila  · 技术社区  · 16 年前

    我正在开发一个Web服务,它的方法将从“动态横幅”中调用,该横幅将显示从SQL Server表中读取的消息队列。

    在高流量站点的主页上,横幅会有很大的压力;每次加载横幅时,它都会调用我的Web服务,以获取新的消息队列。

    现在:我不希望每次加载横幅时所有这些流量都将查询驱动到数据库,因此我正在考虑使用ASP.NET缓存(即httpruntime.cache[cachekey])来限制数据库访问;我将尝试每隔一分钟左右刷新一次缓存。

    很明显,我会尽量少发信息,以限制流量。

    但是,也许还有其他方法来处理这种情况;例如,我可以在文件系统上编写队列的最后一个版本,并让Web服务访问该文件;或者混合使用这两种方法……

    解决方案是C Web服务、ASP.NET 3.5、SQL Server 2000。

    有什么暗示吗?其他方法?

    谢谢

    安德莉亚

    7 回复  |  直到 14 年前
        1
  •  4
  •   Sklivvz    16 年前

    这取决于很多事情:

    • 如果数据没有什么变化(比如后台有“发布”按钮或者每天批量),那么我肯定会使用静态文件(通过后台的push更新)。我们在几个大型网站上使用了这个解决方案,并且效果非常好。
    • 如果数据足够小,内存缓存(即HTTP缓存)是可行的,但要注意锁定问题,还要注意HTTP缓存 不会 在内存负载很重的情况下工作得很好,因为如果框架需要内存,项可能会提前过期。我以前被它咬过!有了上述警告,HTTP缓存工作得相当好。
        2
  •  2
  •   Mike Becatti    16 年前

    我认为缓存是一种合理的方法,您可以更进一步,向它添加一个SQL依赖项。

    ASP.NET Caching: SQL Cache Dependency With SQL Server 2000

        3
  •  1
  •   Mike Becatti    16 年前
        4
  •  1
  •   user11826    14 年前

    写一个文件是一个更好的解决方案imho-它由IIS内核代码提供,没有巨大的ASP.NET开销,您可以稍后将该文件复制到cdn。

    Afaik依赖性兑现在SQL Server 2000中不是很有效。

        5
  •  0
  •   Mitchel Sellers    16 年前

    另外,绕过skliwz提到的内存限制的一种方法是,如果您在正常应用程序之外使用此服务,则可以将其隔离在自己的应用程序池中。我以前见过这样做,这也有帮助。

        6
  •  0
  •   ila    16 年前

    谢谢大家,因为数据的大小很小,但是基础表会改变,我想我会采用httpcache的方式:我实际上需要一种减少数据库访问的方法,即使数据正在改变(这就是为什么不使用@bloodhound建议的直接SQL依赖项的原因)。

    我想在公开之前我会做一些压力测试。

    再次感谢大家。

        7
  •  0
  •   Sklivvz    16 年前

    当然,您也可以(应该)使用 SixPack library .

    • 基于httpcache的正向(普通)缓存,它通过在类上放置属性来工作。使用起来最简单,但在某些情况下,您必须等待从数据库中实际提取内容。
    • 预取缓存,从零开始,在第一次调用之后,将开始刷新后台缓存,并且在某些情况下,您可以保证在不等待的情况下获得内容。

    有关 SixPack library homepage . 请注意,代码(尤其是转发缓存)是经过负载测试的。

    下面是一个简单缓存的示例:

        [Cached]
        public class MyTime : ContextBoundObject
        {
                [CachedMethod(1)]
                public DateTime Get()
                {
                        Console.WriteLine("Get invoked.");
                        return DateTime.Now;
                }
        }