当您处理大量请求时,以这种方式离线处理请求是一种常见模式。
您是否应该甚至可以这样做取决于许多因素。
主要因素是:您的调用者是否需要同步查看对其请求的响应?
我的意思是,调用者是否必须立即且绝对确定地知道数据库是否成功地将其数据作为调用响应的一部分提交?如果是这样,那么离线处理请求并不是一个真正的选择。
但是,如果可以接受向调用者发送一个响应,说明他们的请求将被离线处理(并且任何所需的响应也会离线发送),那么使用队列肯定会对您的整体架构有利。
首先受益的是前端可用性问题。
如果您在短时间内处理数千个请求,并且每个请求都由一个线程提供服务,然后该线程消失并将数据插入数据库,那么您很可能会遇到不存在可用的调度程序线程来服务传入请求的问题。
然而,通过减少 IIS 正在执行的后端工作量(写入本地队列相对于数据库调用来说确实很便宜),您还可以减少基于可用性的故障的可能性。
其次,通过使用队列,您将有一种限制后端流量的方法,因为您可以控制后端处理的吞吐量。
例如,您可以有一个单线程队列读取器进程,它将请求出队并将其处理到数据库中。如果您发现队列中有消息堆积,您可以通过托管更多实例来扩展队列读取器服务。
这意味着您可以减少出现数据库争用问题的可能性,因为您可以更好地控制任一时间数据库上的访问线程数量。
因此,通过使用队列,您可以减少失败并降低管理开销,这是编写良好的应用程序的标志。尤其是当您考虑在网络服务器上托管数据库时!
另外,您应该阅读一种名为CQRS,其核心原则之一是离线写入数据库。