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