AspNetCore应用注意这一点,CTO会对你刮目相看

背景

已经有很多文章记录了Web程序中采用异步编程的优势和.Net异步编程的用法, 异步编程虽然不能解决查询数据库的瓶颈, 但是利用线程切换,能最大限度的弹性利用工作线程, 提高了web服务的响应能力。

      ????9012年了,再不会异步编程你是真老了 ????

     本文要说的是利用异步编程中的取消机制缓解数据库的查询瓶颈,开发者只需在MVC/WebAPI查询方法体内关注CancellationToken并适时取消异步任务, 这将大大提高应用的响应能力。

头脑风暴

想象你请求某网站页面,该页面正闪着菊花试图努力绽放(正在加载),最终你忍不了:

① F5刷新

② 转向其他页面

③ 点击浏览器“停止”按钮 

对于Web服务器,用户快速刷新5次,服务器将被迫接受 5倍的工作量,这是因为即使用户刷新了浏览器(或点击停止按钮), 虽然取消了原始浏览器请求,但是Web服务器并不Care,仍然按部就班处理进入HTTP pipeline的请求(MVC/WebAPI 中默认行为,②③场景类似)

在异步编程中能向任务发出Cancellation信号,停止web服务器后端查询行为。在.NET中,这是使用CancellationToken完成的:

  • 取消令牌的实例传递到异步任务

  • 异步任务监视令牌,以查看请求是否已经被取消。

  • 如果请求取消,则应停止执行正在执行的操作。.NET中的大多数异步方法将具有接受取消令牌的重载。

tip

本文取消的请求,指的是耗时长的服务端读取请求(返回数据但不修改数据的查询),取消已修改数据的请求对于用程序可能不是一个好的选择:

① 是否真的要因为用户导航到应用的另一个页面而取消保存?也许可以,但也可能不会。

② 提高了复杂性,因为数据库服务器可能需要回滚事务,这是一项昂贵的操作。

AspNetCore实践

访问MyReallySlowReport页面,等待5s,最终他们放弃去了其他页面:

所有正在进行的请求都将被取消。

P1 监测CancellationToken令牌

MVC/WebAPI能收到取消请求的信号。开发者只需要在Controller Action中添加CancellationToken参数,并在后续行为中监测该取消信号。

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
{
    List<ReportItem> items;
    using (ApplicationDbContext context = new ApplicationDbContext())
    {
        items = await context.ReportItems.ToListAsync(cancellationToken);
    }
    return View(items);
}

上述EF的调用api支持取消异步操作,故很容易取消SQL的查询行为;对于自定义的长耗时查询行为,可以使用CancellationToken的原生触发用法:

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
{
    List<ReportItem> items;
    using (ApplicationDbContext context = new ApplicationDbContext())
    {
        items = await context.ReportItems.ToListAsync(cancellationToken);
    }

    foreach (var item in items)
    {
        cancellationToken.ThrowIfCancellationRequested();
            // slow non-cancellable work
            Thread.Sleep(1000);
    }
    return View(items);
}

P2 处理取消异步操作向上抛出的异常处

Web服务器触发取消信号,一般会向上会抛出OperationCanceledException或TaskCancellationException,所以为了记录这种非常规异常,建议采用独立的ExceptionFilter。

public class OperationCancelledExceptionFilter : ExceptionFilterAttribute
{
    private readonly ILogger _logger;

    public OperationCancelledExceptionFilter(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<OperationCancelledExceptionFilter>();
    }
    public override void OnException(ExceptionContext context)
    {
        if(context.Exception is OperationCanceledException)
        {
            _logger.LogInformation("Request was cancelled");
            context.ExceptionHandled = true;
            context.Result = new StatusCodeResult(400);
        }
    }
}

P3 想要得到CTO的大拇指,继续思考吧

以上是后端程序员利用取消机制缓解异步查询瓶颈的操作,从web应用全流程角度思考,这个优化还能提升吗? ????

> 以上是传统的网页请求场景,在取消请求时,浏览器帮助我们发起了Cancellation信号。

> 想想日益常见的SPA程序(单页面程序),绝大部分页面请求都是Ajax请求,你点击应用的另外一个“页面”(JS代码维护页面导航),浏览器不会自动取消请求。所以在SPA应用中要前端自己发出取消请求的信号:

var xhr = $.get("/api/myslowreport", function(data){
  //show the data
});

//If the user navigates away from this page
xhr.abort()

前后端程序猿通力配合,应用的吞吐量和响应能力极大提升,CTO要给各位加薪了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core如何限制请求频率

ASP.NET Core如何限制请求频率&#xff0c;为了防止恶意请求&#xff0c;我们往往会对接口请求的频率做限制&#xff0c;比如请求间隔&#xff0c;一段时间内请求的次数&#xff0c;针对部分IP做出不同的限制策略如何去限制请求频率不需要我们去实现&#xff0c;用上AspNetCore…

从AppDomain迁移到AssemblyLoadContext

AssemblyLoadContext基本上AssemblyLoadContext是AppDomain的继承者&#xff0c;它提供相同而且更多的功能-除了安全边界&#xff08;隔离&#xff09;。最小的安全边界是进程&#xff0c;因此你将需要使用进程间通信来正确隔离数据和代码执行。官网文档中提到Appdomain已经过时…

【.NET Core 3.0】小技巧 || 原生DI一对多注入

本文是一个技巧文章&#xff0c;内容很短&#xff0c;但是被提问的频率很高&#xff0c;所以记录下来&#xff0c;以待大家不时之需。以下的代码&#xff0c;是通过原生的依赖注入来讲解的&#xff0c;其他的第三方框架&#xff0c;可以自己自定义扩展&#xff0c;效果是一样的…

大话数据结构学习笔记二:算法

一 算法定义 算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 二 算法的特性&#xff1a; 1 输入输出&#xff1a;算法具有零个或者多个输入&#xff0c;至少有一个或者多个输出。 2 有穷性&…

ASP.NET Core 3.0 gRPC 身份认证和授权

一.开头聊骚本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了&#xff0c;以后在实际使用中&#xff0c;可能会发一些经验之文。本文主要讲 ASP.NET Core 本身的认证授权和gRPC接入&#xff0c;认证方式采用目前主流的 JWT 结合 IdentityServer4。二.服务端配置我们…

ASP.NET Core中使用MediatR实现命令和中介者模式

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9866068.html在本文中&#xff0c;我将解释命令模式&#xff0c;以及如何利用基于命令模式的第三方库来实现它们&#xff0c;以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此…

使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由

路由机制会把一个请求的URI映射到一个Controller上面的Action&#xff0c;所以当你发送一个HTTP请求的时候&#xff0c;MVC框架会解析这个请求的URI&#xff0c;并尝试着把它映射到一个Controller上面的Action。两个路由中间件在ASP.NET Core 3.x里面&#xff0c;建议使用Endpo…

EFCore批量操作,你真的清楚吗

背景EntityFramework Core有许多新的特性&#xff0c;其中一个重要特性便是批量操作。批量操作意味着不需要为每次Insert/Update/Delete操作发送单独的命令&#xff0c;而是在一次SQL请求中发送批量组合指令。EFCore批量操作实践批处理是期待已久的功能&#xff0c;社区多次提出…

asp.net core 自定义 Policy 替换 AllowAnonymous 的行为

asp.net core 自定义 Policy 替换 AllowAnonymous 的行为Intro最近对我们的服务进行了改造&#xff0c;原本内部服务在内部可以匿名调用&#xff0c;现在增加了限制&#xff0c;通过 identity server 来管理 api 和 client&#xff0c;网关和需要访问api的客户端或api服务相互调…

前端小白在asp.net core mvc中使用ECharts

对于在浏览器中绘制图形图表&#xff0c;目前有较多的js类库可以使用&#xff0c;如&#xff1a;ChartJS&#xff0c;Flot&#xff0c;canvasjs等&#xff0c;但是今天介绍的主角为国产图表库&#xff0c;并在apache孵化&#xff0c;就是大名鼎鼎的echarts。前方高能【官方介绍…

超过1w的Github Star大佬和他们的公众号,太强了!

不少同学担忧的情况——“晋升无望、收入见顶、生活开支飙升、财务危机如影随形”&#xff0c;小编精心挑选了几个优质原创技术号&#xff0c;推荐给大家化解成长的烦恼。他们都是我平时关注的优秀号主&#xff0c;分享给大家&#xff0c;助大家学习路上披荆斩棘~Python爱好者社…

Java和C++区别

Java和C的区别有很多&#xff0c;主要集中在如下几个方面&#xff1a; 运行机制 Java&#xff1a; 编写&#xff1a;是指在Java开发环境&#xff08;Eclipse、Sublime等&#xff09;中进行程序代码的输入&#xff0c;最终形成后缀名为.java的Java源文件。 编译&#xff1a;是指…

未雨绸缪 | 一文简介 Azure Front Door

点击上方蓝字关注“汪宇杰博客”导语昨天早晨微软服务器发生了核爆&#xff0c;Office 365&#xff0c;Bing&#xff0c;Azure DevOps全线完蛋。人类文明危在旦夕之际&#xff0c;微软美国的死士凌晨2点爬起来收福报&#xff0c;修好了服务器&#xff0c;拯救了全人类&#xff…

左手专注,右手时间

大家好&#xff0c;我是Z哥。今天带来的是一篇有感而发的随笔&#xff0c;敬请品尝&#xff5e;前两天最火的事情莫过于WPS上市了。这个平时默默无闻、低调的可怕的产品一下子被捧上了天。我第一次接触到WPS还比较晚&#xff0c;大约在2014年的样子&#xff0c;当时由于某些特殊…

说说开源那些事儿

“ 阅读本文大概需要 9 分钟。 ”前段时间我们遇到了一个情况&#xff0c;课程推送发出来之后有位同学在群里提到&#xff0c;机构提供的项目就是他同学导师的开源项目。之后这位导师在文章评论里联系了我&#xff0c;表示该机构课程涉嫌开源侵权他的 GitHub 开源项目。我们后台…

Linux下Tomcat安装和配置

1、前提&#xff08;JDK环境&#xff09;Tomcat的安装需要JDK环境&#xff0c;如何配置JDK环境见我的文章Linux下Java环境配置&#xff0c;所以在安装Tomcat之前需要先检测JDK环境是否配置好。 进入命令行界面&#xff0c;输入java -version命令来查看JDK环境是否配置成功&…

ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记

点击蓝字关注我们课程链接&#xff1a;http://video.jessetalk.cn/course/explore良心课程&#xff0c;大家一起来学习哈&#xff01;任务1&#xff1a;课程介绍1、介绍与引入2、配置管理3、依赖注入4、ASP.NET Core HTTP介绍5、认证与授权6、ASP.NET Core MVC任务2&#xff1a…

Eclipse下Tomcat服务器配置和使用

在安装完Tomcat之后&#xff0c;在没有进行相关配置时&#xff0c;我们需要到终端下面去启动Tomcat。如果我们在使用Eclipse进行Java开发时&#xff0c;如果能够直接启动Tomcat服务器那将是极为方便&#xff0c;本篇就来讲述Eclipse下Tomcat服务器如何配置以及如何使用。 1、配…

Facebook押注VS Code

Facebook 近日宣布默认采用 VS Code 作为内部开发环境。去年 Facebook 宣布停止维护其开源的 Nuclide/Atom-IDE&#xff0c;以及相关的一些库。Nuclide/Atom-IDE 是 Atom 编辑器的功能包&#xff0c;其通过语言服务器协议与自定义语言服务器交互&#xff0c;为 Atom 提供一系列…

Linux下软件安装和卸载

在Windows下&#xff0c;我们安装软件基本上是先到网上下载软件的安装包&#xff0c;通常是以.exe和.msi为后缀的文件&#xff0c;然后双击安装包&#xff0c;之后就可以按照软件安装向导一步步进行安装了&#xff0c;但在Linux下&#xff0c;软件的安装方式截然不同。总的来说…