详解异步任务 | 看 Serverless Task 如何解决任务调度&可观测性中的问题
在上篇文章《解密函数计算异步任务能力之「任务的状态及生命周期管理」》中,我们介绍了任务系统的状态管理,并介绍了用户应如何根据需求,对任务状态信息进行实时的查询等操作。在本篇中我们将会进一步走进函数计算异步任务,介绍异步任务的调度方案以及系统在可观测性方面所支持的各项功能。
一、任务调度
任务调度多指系统根据当前负载情况,将不同任务放到合适的计算资源中去执行的相关操作。一个完善的调度系统往往需要平衡不同特点的任务间的隔离以及效率最优这两个需求。函数计算异步任务采用了独立队列模型及自动负载均衡策略,具备在不影响处理性能的前提下进行多租隔离的能力。
Serverless Task 任务调度模型
当用户提交一次任务后,系统会将该任务转换为一条消息,并通过异步下发的方式放入到内部队列中。一条消息的处理流程如下图所示:
图 1
整个系统在任务调度方面的多租隔离及消息积压控制方面主要依赖的是 Scheduler 对于队列的消费及控制。我们事先会为每一位用户划分一个账号级别的队列,该用户的所有函数的异步调用(包括任务调用)会共享该队列。
这样的模型结构会保证每个用户的异步执行请求(包括任务调用)均不会受到其他用户的调用情况的影响。但是在一些大规模应用场景,如一个用户的函数很多,并且每个函数的调用量都很大的情况下,所有的异步消息共用一个队列难免造成调用间的相互影响。部分长尾调用可能会过多的消耗队列的资源,导致其他函数的执行出现饥饿的现象。
为了避免这种情况影响重要函数的执行,函数计算提供了更细力度的队列 - 函数级别的队列。可以通过对每个不同函数设置单独的队列,确保高优先级函数的消费情况不会受同账号下的其他函数执行的影响。队列间的关系如下图所示:
图 2
典型的应用场景
假设某用户 A 具有 2 个不同的任务函数。其中一个任务 A 由于下游服务的限制,需要一个消息一个消息的执行;而另外一个任务 B 是大并发任务,并且希望尽快执行完。在默认模式下,任务 A 和 B 共享同一个用户队列;这时会出现如下场景:任务 A 由于具有并发度限制,函数计算侧会对整个任务队列进行出队速率控制。这就导致了任务 B 的任务迟迟无法出队。而当任务 A 执行完后,任务 B 得到了出队机会,此时并发度升高,任务 B 的消息抢占了资源池进行执行,任务 A 又变得难以出队,很长时间也无法开始一次执行。这样的结果就是无论 A 还是 B 都受到了对方业务的严重干扰。
当进行队列调整后,任务 A 和 B 分别独占队列。在这种情况下任务 A 和 B 的消费速度不受对方影响,都可以达到自身的诉求。
目前 Serverless Task 提供了任务积压大盘,您可以在任务界面获取目前已经积压的任务数,综合分析是否需要开启函数的独占队列。
Serverless Task 任务队列负载均衡模型
上面介绍了如何通过函数级别队列来避免出现 “Noisy Neighbour” 问题。但是在一些场景下,如果任务的并发量级过大,即便对该任务划分了单队列,也会导致任务的积压。这个问题的解决需要引入 Serverless Task 的负载均衡策略。
函数计算的任务处理模块具有 Partition 的概念。每个用户默认属于一个 Partition,负责该 Partition 的 Scheduler 会监听用户对应的任务队列。当出现严重积压时,我们会为用户按照负载情况分配多个 Partition,并交由不同的 Scheduler 负责消费,来提升任务整体的消费速度。
图 3
可以看到,阿里云函数计算在任务队列管理方面默认做到了多租及隔离的能力,可以适用于绝大多数场景。针对一些重负载、长执行、并发量大的场景,函数计算还支持横向扩容,加快消费速度。在任务隔离方面,函数计算支持针对不同优先级的函数进行单独隔离,避免出现 Noisy Neighbour 的问题。
二、可观测性
任务的可观测能力是任务系统必不可少的能力之一。强大的可观测性将有助于业务方减少在任务运行的各个阶段所需要额外进行的工作量。
- 开发阶段:任务的在线调试能力、运行结果的 Debug 能力将直接影响业务上线进度;
- 业务常规运行阶段:各种监控、流量情况的统计以及运行时日志将协助用户快速了解业务的发展、变化,以及出现故障时的快速定位 & 处理;
- 阶段性审计:任务的历史记录存储及保留将为用户提供良好的可追溯能力,可以根据历史信息进行后续的业务规划。
ServerlessTask 可观测性支持 - 开发测试阶段
业务的开发阶段最主要的诉求就是快速调试并定位问题。在对该阶段的支持中,ServerlessTask 提供了登录实例及实时日志的能力。当代码开发并上传后,测试 - debug - 修改代码 - 再次测试的流程可以全部在控制台完成,极大的提高了研发效率。如果有需要性能调试、第三方 Binary 调试(如音视频处理领域的 FFmpeg 调试)等可以借助登录实例功能完成。操作流程如下图所示:
选择想登录实例的任务,点击实例链接。
会进入到实例监控页面,点击右上角的登录实例功能,即可登录到对应的实例上。
ServerlessTask 可观测性支持 - 业务上线后运行阶段
当业务上线后,经常容易出现因容量预估不足导致下游系统无法承载压力,导致故障。因此 ServerlessTask 提供了运行时指标,即一段时间内的任务提交数、完成数及执行情况。用户可以根据这张指标图快速了解当前业务的负载情况。当用户任务的下游消费较慢,可能造成任务积压,这种情况也很容易在指标图中反映出,进而快速做出相应的反应。目前 ServerlessTask 所提供的相关指标如下:任务监控大盘提供以下任务监控数据:
监控指标 | 说明 |
---|---|
提交的任务数 | 在过去 1 分钟内所提交的任务总数,包括运行中的、已完成的及未出队的数量。 |
完成的任务数 | 在过去 1 分钟内提交的任务所完成的任务数,包括执行成功或失败的。 |
排队中的任务数 | 在过去 1 分钟内提交的任务,还在排队中的数量。如果该数量不为 0,则说明任务有积压。 |
运行中的任务数 | 在过去 1 分钟内提交的任务处于运行中的任务数。 |
运行失败任务数 | 在过去 1 分钟内提交的任务处于运行失败的任务数。 |
运行已占用实例数 | 在过去 1 分钟内提交的任务处于运行成功的任务数。 |
在快速定位问题方面,函数计算支持实时查看函数日志及实例指标。您可以进入到任务的列表页面,找到实际执行失败的任务,进入日志页面及实例页面进行问题定位:
ServerlessTask 可观测性支持 - 阶段性审计
当线上任务运行一段时间后,往往需要进行一系列的阶段性审计工作,比如上一周的执行总任务数,执行失败的任务数及执行失败的时间。目前除了控制台以外,函数计算提供了丰富的 API 能力来进行任务的审计工作。主要包括以下几方面能力:
- 根据状态进行过滤,只查询某一个状态的执行;
- 根据触发时间进行过滤,如查询过去某一段时间内发起的任务;
- 根据任务名称查询。如果您的任务具有业务上下游的 TraceID,您可以在触发任务时指定一个有意义的任务ID。后续可以根据 ID 前缀进行范围查询;
上面的几个过滤方式可以组合,达到更便捷的需求。控制台所支持的过滤条件如下图所示:更多参数内容可参考: ListStatefulAsyncInvocation 。
ServerlessTask 可观测性支持 - 死信队列及业务补偿
在消息领域,有一个非常重要的概念 - 死信队列。当一些消息无法被消费时,这些消息往往需要存储到一个地方,以便后续人为的介入处理,避免因未进行处理而造成业务损失。Serverless Task 也支持了这样一类功能。您可以对 Serverless Task 设置目标功能;当任务执行失败后,函数计算支持自动将执行失败的上下文信息推送到消息队列等消息服务中,以便后续处理。如果您的处理逻辑支持自动化,函数计算还支持将失败任务的上下文信息推送回函数计算,执行一段您的自定义业务逻辑来实现业务补偿。
您可以在异步调用配置页面配置成功及失败目标。
更多配置内容请参考:PutFunctionAsyncInvokeConfig。
综上所述,Serverless Task 所提供的可观测能力可以有效支持任务全生命周期的监测需求。所有控制台能力均可以使用开放 API 进行定制化开发,来满足更多的需求。Serverless Task 的目标功能除了可以做到任务失败补偿以外,还可以作为 Event-Driven 模式的数据源,自动的将处理后的事件投递到下游服务中。
往期文章(+超链接):
1、异步任务处理系统,如何解决业务长耗时、高并发难题?
2、函数计算异步任务能力介绍-任务触发去重
3、解密函数计算异步任务能力之-任务的状态及生命周期管理
Serverless 近期热门活动推荐
Serverless 函数计算评测征文活动来啦,6月28日-7月31日期间,参与产品评测投稿发布文章,即有机会获得 Beats 耳机、机械键盘、千元天猫超市卡、优酷会员季卡诸多好礼等你赢取!
投稿方向可参考(但不限于):
- 您对函数计算FC产品能力的体验和建议,帮助其他用户选用 Serverless 服务。
- 使用函数计算 FC 创建应用的场景评测,如基于函数计算 FC 搭建云上博客、搭建弹性高可用 Serverless Web 应用、构建基于 Serverless 架构的弹性高可用视频处理系统等。
更多活动详情,请移步官网了解:
https://developer.aliyun.com/topic/serverless2022
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
详解异步任务 | 看 Serverless Task 如何解决任务调度&可观测性中的问题的更多相关文章
- 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:
原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...
- Django(41)详解异步任务框架Celery
celery介绍 Celery是由Python开发.简单.灵活.可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务.Celery ...
- Java集合详解6:这次,从头到尾带你解读Java中的红黑树
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
- linux自动化交互脚本expect详解set timeout 5是 意思是在expect语句中,5s后超时,不再作出选择。
linux自动化交互脚本expect详解 更新时间:2020年10月21日 10:13:20 作者:lendsomething 这篇文章主要介绍了linux自动化交互脚本expect的相 ...
- 【详解】换一个角度看Socket的数据读写
前言 以前对IO.NIO还算了解,也写过Netty的项目.但是对底层的数据传递不是很了解,一直存有这方面的疑惑.但是由于有其他事情就被打断了.前阵子因为想要了解volatile关键字的原理,学习了下J ...
- css3笔记系列-3.css中的各种选择器详解,不看后悔系列
点击上方蓝色字体,关注我 最详细的css3选择器解析 选择器是什么? 比较官方的解释:在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. 最常见的 CSS 选择器是元素选择器.换句话说 ...
- Android开发之recycleView详解代码,看完包你熟练掌握recycleView的用法。转自网络经典文章
来源 http://jinyudong.com/2014/11/13/Introduce-RecyclerView-%E4%B8%80/ 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在 ...
- Web.config配置文件详解(新手必看)(转)
转于:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html <?xml version="1.0" ...
- [转]Web.config配置文件详解(新手必看)
本文转自:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html 花了点时间整理了一下ASP.NET Web.config配 ...
- 转:Web.config配置文件详解(新手必看)
转:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html 花了点时间整理了一下ASP.NET Web.config配置文件 ...
随机推荐
- 渐进式web全栈:blazor web app
前言 本文要说的这种开发模式,这种模式并不是只有blazor支持,js中有一样的方案next.js nuxt.js:blazor还有很多其它内容,本文近关注渐进式开发模式. 是的,前后端是主流,不过以 ...
- [ABC262C] Min Max Pair
Problem Statement You are given a sequence $a = (a_1, \dots, a_N)$ of length $N$ consisting of integ ...
- 聊聊流式数据湖Paimon(五)
从Demo入手,了解Paimon/Flink项目搭建的全过程.记录下采坑之旅. 创建Flink项目 在IDEA中创建Flink项目,由于没有Flink的archetype,因此需要手动创建一下. 参考 ...
- Python——第三章:函数的返回值
函数的返回值: 函数执行之后. 会给调用方一个结果. 这个结果就是返回值 关于return: 函数只要执行到了return. 函数就会立即停止并返回内容. 函数内的return的后续的代 ...
- MySQL运维实战(1.1)安装部署:使用RPM进行安装部署
作者:俊达 我们在生产环境部署mysql时,一般很少使用RedHat Package Manager(RedHat软件包管理工具).用rpm或或者其他包管理器安装mysql有其好处,例如安装简单,并且 ...
- 我用 Laf 开发了一个非常好用的密码管理工具
[KeePass 密码管理]是一款简单.安全简洁的账号密码管理工具,服务端使用 Laf 云开发,支持指纹验证.FaceID,N 重安全保障,可以随时随地记录我的账号和密码. 写这个小程序之前,在国内市 ...
- VSCode C++开发环境配置:CMake 调试配置 launch.json
相关内容 VSCode C++开发环境配置: LLVM clang clangd 安装 cmake sudo apt install cmake 安装 VSCode 插件 CMake CMakeToo ...
- java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现? 答案2023-06-21: java的: 这个问题,我问了一些人,部分人是回答得有问题的. ...
- C# 将XML转为Word(附VB.NET代码)
本文介绍如何通过C#程序代码方法将XML文件转换为Word文档,包括转为.doc /.docx等格式.并附VB.NET代码,有需要可供参考. 程序中所需必要程序集如下图: ★ 程序集获取:官方地址: ...
- Java PDF文档转换 — PDF转Excel、SVG转PDF
概述 Spire.PDF for Java支持将PDF文档高质量地转换为XPS.图片.SVG.Word.HTML和PDF/A格式,以及支持将XPS.HTML文档转换为PDF格式.本文将通过代码演示来介 ...