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