包含此控件的页面可能会在很短的时间内收到数千次点击,我担心打开数据库连接,插入记录然后关闭每个请求的连接的性能问题.
我遇到的一个解决方案是让Web控件将消息放入MSMQ队列,并让服务器上的Windows服务定期读取队列并执行批量插入.
考虑到Web和数据库服务器在同一台机器上运行,这听起来像是一种合理的架构.听起来有必要吗?
从我在数据库中看到的,使用MSMQ的大多数好处都与弹性而不是性能有关,所以我可能会咆哮错误的树.
非常感谢任何建议
非常感谢
皮特
解决方法
您是否应该甚至可以做到这一点取决于许多因素.
主要因素是:您的呼叫者是否需要同步查看对其请求的响应?
我的意思是,如果数据库成功将其数据作为呼叫响应的一部分提交,则调用者必须立即并绝对确定地知道吗?如果是这样,那么离线请求处理实际上不是一种选择.
但是,如果可以接受呼叫者可以发送响应,表示他们的请求将被脱机处理(并且任何所需的响应也被脱机发送),那么使用队列肯定会使整个架构受益.
将受益的第一件事是前端可用性问题.
如果您在短时间内处理数千个请求,并且每个请求都由一个线程提供服务然后消失并将数据插入数据库,很可能会遇到没有可用的调度程序线程来处理传入请求的问题.
但是,通过减少IIS正在执行的后端工作量(写入本地队列相对于数据库调用而言非常便宜),您还可以降低基于可用性的故障的可能性.
其次,通过使用队列,您将有一种限制后端流量的方法,因为您可以控制后端处理的吞吐量.
例如,您可以拥有一个单线程队列读取器进程,该进程将请求降级并将其处理到数据库中.如果您发现队列中有消息,您可以通过托管更多的实例来扩展队列读取器服务.
这意味着您正在减少出现数据库争用问题的可能性,因为您可以在任何时候更好地控制数据库上访问线程的数量.
因此,通过使用排队,您可以减少故障并降低管理开销,这是编写良好的应用程序的标志.特别是当您考虑在Web服务器上托管数据库时!