如何在.NET Core 3.1和Entify Framework Core中处理非常大的请求是一个好主意

问题描述

我想从Angular发送删除请求,但是该请求需要检查数据库中的许多表。该任务需要很长时间才能完成,如何处理这种情况?

我不想让前端等待响应,我想在后台处理任务,并在任务完成时向前端发送消息。

不用等待就可以使用Task吗?

解决方法

Using Task without wait is a good idea?

不。异步Web请求旨在允许Web服务器释放响应线程,而不是 尝试使Web请求本身更快。

面对需要捕获来自客户端的请求并在后台处理该请求而无需客户端期望/等待结果的需求,我将考虑采用排队机制。 API Web请求接受数据并将请求详细信息推送到处理队列中。后台Windows服务可以将消息弹出队列,使用EF处理针对数据的请求,并处理任何异常等。

使用队列进行长时间运行的操作的主要注意事项是它可以帮助包含并发请求。如果一次操作要花费30秒钟以上的时间才能完成并导致数据库锁定,并由API调用触发,那么当您的Web服务器在几分钟内收到100个此类请求时,会发生什么?如果Web服务器只是产生后台线程/任务,则这些线程/任务将很快彼此之间以及其他尝试访问数据库的请求开始死锁。通过使用队列,您可以随时限制处理多少个请求。可能有100个请求排队,但是处理服务可以确保在任何时候都只有一个或几个正在处理。

可以通过许多启用了持久性的库(例如MSMQ)来简化队列,或者可以完全使用一个或多个数据库表来管理队列。将请求字段写为具有创建的时间戳记,isProcessing和/或结果列的记录。该服务将按添加顺序轮询以拾取一或多个行,将其标记为处理中,然后更新结果或在完成后删除该行。