在 .NET Core 3.1 和 Entity Framework Core 中处理非常大的请求是一个好主意[关闭]
Posted
技术标签:
【中文标题】在 .NET Core 3.1 和 Entity Framework Core 中处理非常大的请求是一个好主意[关闭]【英文标题】:How a good idea to deal with very large request in .NET Core 3.1 and Entify Framework Core [closed] 【发布时间】:2020-12-27 10:23:19 【问题描述】:我想从 Angular 发送一个删除请求,但该请求需要检查数据库中的很多表。任务需要很长时间才能完成,我该如何处理这种情况?
我不希望前端等待响应,我想在后台处理任务并在任务完成时向前端发送消息。
不等待就使用 Task 是不是很划算?
【问题讨论】:
这类问题最好在软件工程等不同的 StackExchange 社区中提供。 *** 面向特定的编程问题问答。 【参考方案1】:Using Task without wait is a good idea?
没有。异步 Web 请求旨在允许 Web 服务器释放响应线程,不试图让 Web 请求本身更快。
面对捕获来自客户端的请求并在后台处理它而客户端不期待/等待结果的要求,我会考虑采用排队机制。 API Web 请求接受数据并将请求详细信息推送到处理队列中。后台 Windows 服务可以从队列中弹出消息,使用 EF 处理针对数据的请求,以及处理任何异常等。
为长时间运行的操作使用队列的主要考虑因素是它可以帮助包含并发请求。如果单个操作需要 30 多秒才能完成并导致数据库上的许多锁定并由 API 调用触发,那么当您的 Web 服务器在几分钟内收到 100 个此类请求时会发生什么?如果 Web 服务器只是产生后台线程/任务,它们将很快开始相互死锁,以及其他尝试访问数据库的请求。通过使用队列,您可以限制任何时候处理的这些请求的数量。可能有 100 个请求排队,但处理服务可以确保任何时候只有一个或少数几个在处理。
队列可以通过一些支持持久性的库(如 MSMQ)来促进,或者可以完全使用一个或多个数据库表来管理。将请求字段写入具有已创建时间戳、isProcessing 和/或结果列的记录。服务轮询以按添加顺序选取一行或多行,将它们标记为正在处理,然后更新结果或在完成时删除该行。
【讨论】:
以上是关于在 .NET Core 3.1 和 Entity Framework Core 中处理非常大的请求是一个好主意[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
命令更新迁移、Entity Framework 3.15、Net Core 3.1 中的错误
如何使用 FromSqlRaw Entity Framework Core 3.1 从存储过程中返回多个 SELECT 集
Entity Framework Core 数据保存原理详解
Entity Framework Core 数据保存原理详解