高流量 Web 服务的提示,c# asp.net sql2000
-
09-06-2019 - |
题
我正在开发一个 Web 服务,其方法将从“动态横幅”中调用,该横幅将显示从 SQL Server 表读取的某种消息队列。
横幅在高流量网站的主页上会产生很大的压力;每次加载横幅时,它都会调用我的 Web 服务,以便获取新的消息队列。
现在:我不希望每次加载横幅时所有这些流量都会驱动对数据库的查询,因此我正在考虑使用 asp.net 缓存(即HttpRuntime.Cache[cacheKey]) 限制数据库访问;我会尝试每分钟左右刷新一次缓存。
显然,我会尝试尽可能少地发送消息,以限制流量。
但也许还有其他方法来处理这种情况;例如,我可以在文件系统上写入队列的最新版本,并让 Web 服务访问该文件;或者混合两种方法的东西......
解决方案是c# web服务、asp.net 3.5、sql server 2000。
有什么提示吗?其他方法?
谢谢
安德里亚
解决方案
这取决于很多事情:
- 如果数据几乎没有变化(想想带有“发布”按钮或每日批次的后端),那么我肯定会使用静态文件(通过后端推送更新)。我们在几个大型网站上使用了这个解决方案,并且效果非常好。
- 如果数据足够小,内存缓存(即Http Cache)是可行的,但要注意锁定问题,还要注意 Http Cache 将不会 在内存负载较重的情况下也能很好地工作,因为如果框架需要内存,项目可能会提前过期。我以前也被它咬过!有了上述注意事项,Http Cache 就可以很好地工作了。
其他提示
我认为缓存是一种合理的方法,您可以更进一步并向其添加 SQL 依赖项。
恕我直言,编写文件是一个更好的解决方案 - 它由 IIS 内核代码提供服务,没有巨大的 asp.net 开销,您可以稍后将文件复制到 CDN。
据我所知,SQL Server 2000 的依赖关系兑现效率不是很高。
此外,解决 Skliwz 提到的内存限制的一种方法是,如果您在正常应用程序之外使用此服务,您可以将其隔离在它自己的应用程序池中。我以前见过这样做,这也有帮助。
谢谢大家,由于数据量很小,但基础表会发生变化,我想我会采用 HttpCache 方式:我实际上需要一种减少数据库访问的方法,即使数据正在更改(这就是不使用 @Bloodhound 建议的直接 Sql 依赖项的原因)。
我想在上市之前我会做一些压力测试。
再次感谢大家。
当然你也可以(应该)使用缓存功能 SixPack 库 .
- 转发(普通)缓存,基于 HttpCache,它通过在类上放置属性来工作。使用最简单,但在某些情况下,您必须等待实际从数据库中获取内容。
- 从头开始预取缓存,在第一次调用后将开始在幕后刷新缓存,并且在某些情况下保证您无需等待即可获得内容。
更多信息关于 SixPack 图书馆主页. 。请注意,代码(尤其是前向缓存)经过了负载测试。
这是一个简单缓存的示例:
[Cached]
public class MyTime : ContextBoundObject
{
[CachedMethod(1)]
public DateTime Get()
{
Console.WriteLine("Get invoked.");
return DateTime.Now;
}
}