【问题标题】:Hints for a high-traffic web service, c# asp.net sql2000高流量 Web 服务的提示,c# asp.net sql2000
【发布时间】:2008-09-16 10:57:40
【问题描述】:

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

banner会在高流量网站首页产生较大压力;每次加载横幅时,它都会调用我的网络服务,以获取新的消息队列。

现在:我不希望每次加载横幅时所有这些流量都会驱动对数据库的查询,所以我正在考虑使用 asp.net 缓存(即 HttpRuntime.Cache[cacheKey])来限制数据库访问;我会尝试每分钟左右刷新一次缓存。

显然我会尽量减少消息,以限制流量。

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

解决方案是c# web service,asp.net 3.5,sql server 2000。

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

谢谢

安德烈亚

【问题讨论】:

    标签: c# web-services high-load


    【解决方案1】:

    这取决于很多事情:

    • 如果数据几乎没有变化(想想带有“发布”按钮或每日批次的后端),那么我肯定会使用静态文件(通过从后端推送更新)。我们在几个大型网站上使用了这个解决方案,效果非常好。
    • 如果数据足够小,内存缓存(即 Http Cache)是可行的,但要注意锁定问题,还要注意 Http 缓存不会在重内存负载下工作得很好,因为项如果框架需要内存,可以提前过期。我以前也被它咬过!有了上述注意事项,Http Cache 工作得很好。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          恕我直言,写入文件是一个更好的解决方案 - 它由 IIS 内核代码提供服务,没有巨大的 asp.net 开销,您可以稍后将文件复制到 CDN。

          AFAIK 依赖兑现在 SQL Server 2000 中效率不高。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              谢谢大家,因为数据很小,但是底层表会改变,我想我会走 HttpCache 的方式:我实际上需要一种减少数据库访问的方法,即使数据正在改变(所以这就是不使用@Bloodhound 建议的直接 Sql 依赖项的原因。

              我想我会在上市前做一些压力测试。

              再次感谢大家。

              【讨论】:

                【解决方案7】:

                当然,您也可以(应该)使用 SixPack library 中的缓存功能。

                • 转发(普通)缓存,基于 HttpCache,它通过将属性放在类上来工作。使用最简单,但在某些情况下,您必须等待实际从数据库中获取内容。
                • 从头开始预取缓存,第一次调用后会在后台开始刷新缓存,在某些情况下保证您无需等待即可获得内容。

                有关SixPack library homepage 的更多信息。请注意,代码(尤其是前向缓存)是经过负载测试的。

                这是一个简单缓存的例子:

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

                【讨论】:

                  猜你喜欢
                  • 2021-02-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-04-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-21
                  • 1970-01-01
                  • 2019-07-15
                  相关资源
                  最近更新 更多