通过MSMQ分离Web和数据库层是必要的还是过度的?

时间:2012-04-15 08:06:32

标签: asp.net architecture msmq

我正在整理一个简单的asp.net Web控件,由于ajax表单的结果将记录插入到MSQL数据库中。

包含此控件的页面可能会在很短的时间内收到数千次点击,我担心打开数据库连接,插入记录然后关闭每个请求的连接的性能问题。

我遇到的一个解决方案是让Web控件将消息放入MSMQ队列,并让服务器上的Windows服务定期读取队列并进行批量插入。

考虑到Web和数据库服务器在同一台机器上运行,这听起来是否合理。听起来有必要吗?

从我在数据库中看到的,使用MSMQ的大多数好处都与弹性而不是性能有关,所以我可能会咆哮错误的树。

非常感谢任何建议

非常感谢

皮特

2 个答案:

答案 0 :(得分:10)

以这种方式离线处理请求是处理大量请求时的常见模式。

你是否应该甚至可以做到这一点取决于许多因素。

主要因素是:您的呼叫者是否需要同步查看对其请求的响应?

我的意思是,如果数据库成功将其数据作为呼叫响应的一部分提交,调用者必须立即并绝对肯定地知道吗?如果是这样,那么离线请求处理实际上不是一种选择。

但是,如果可以接受呼叫者可以发送响应,表示他们的请求将被脱机处理(并且任何所需的响应也被脱机发送),那么使用队列肯定会使整个架构受益。

首先受益的是前端可用性问题。

如果您在短时间内处理数千个请求,并且每个请求都由一个线程提供服务然后消失并将数据插入数据库,很可能会遇到没有可用的调度程序线程来维护的问题来电请求。

但是,通过减少IIS正在进行的后端工作量(写入本地队列相对于数据库调用而言非常便宜),您还可以降低基于可用性的故障的可能性。

其次,通过使用队列,您将有一种限制后端流量的方法,因为您可以控制后端处理的吞吐量。

例如,您可以拥有一个单线程队列读取器进程,该进程将请求降级并将其处理到数据库中。如果您发现队列中有消息,您可以通过托管更多的实例来扩展队列读取器服务。

这意味着您减少了获取数据库争用问题的可能性,因为您可以在任何时候更好地控制数据库上访问线程的数量。

因此,通过使用排队,您可以减少故障并降低管理开销,这是编写良好的应用程序的标志。特别是当您考虑在Web服务器上托管数据库时!

此外,您应该阅读一个名为CQRS的架构模式,其中一个主要原因是离线执行数据库写入。

答案 1 :(得分:2)

异步架构有很多好处(由Hugh确定)但肯定会有更高的成本和复杂性。这应该仔细平衡。从2个组件(Web应用程序和数据库),您现在必须开发,维护和监视4个组件(Web应用程序,数据库,批处理服务,MSMQ)。你说网络服务器和数据库服务器是同一台机器,鉴于你的性能要求,它很奇怪。明天您可能需要托管Web应用程序,批处理服务和DB是3台独立的计算机。现在MSMQ也涉及网络。还有一件事可能出错。 多线程批处理器也不容易,如果你必须按照它们生成的顺序处理每个消息(至少对于给定的实体)逻辑可能变得复杂。

如果可能,请测量两种解决方案并做出决定。