详解异步任务:函数计算的任务触发去重​

前言

无论是在大数据处理领域,还是在消息处理领域,任务系统都有一个很关键的能力 - 任务触发去重的保障。这个能力对于一些准确性要求极高的场景中(如金融等)是必不可少的。作为 Serverless 化任务处理平台,Serverless Task 也需要提供这类保障,在用户应用层面及自身系统内部两个维度具备任务的准确触发语义。本文主要针对消息处理可靠性这一主题来介绍函数计算内部的一些技术细节,并展示如何在实际应用中使用函数计算所提供的这方面能力来增强任务执行的可靠性。

浅谈任务去重

在讨论异步消息处理系统时,消息处理的基本语义是无法绕开的话题。在一个异步的消息处理系统(任务系统)中,一条消息的处理流程简化如下图所示:

图 1

用户下发任务 - 进入队列 - 任务处理单元监听并获取消息 - 调度到实际 worker 执行

在任务消息整个的流转过程中,任何组件(环节)可能出现的宕机等问题会导致消息的错误传递。一般的任务系统会提供至多 3 个层级的消息处理语义:

●At-Most-Once:保证消息最多被传递一次。当出现网络分区、系统组件宕机时,可能出现消息丢失;

●At-Least-Once:保证消息至少被传递一次。消息传递链路支持错误重试,利用消息重发机制保证下游一定收到上游消息,但是在宕机或者网络分区的场景下,可能导致相同消息传递多次。

●Exactly-Once机制则可以保证消息精确被传送一次,精确一次并不是意味着在宕机或网络分区的场景下没有重传,而是重传对于接受方的状态不产生任何改变,与传送一次的结果一样。在实际生产中,往往是依赖重传机制 & 接收方去重(幂等)来做到 Exactly Once。

函数计算能够提供任务分发的 Exactly Once 语义,即无论在何种情况下,重复的任务将被系统认为是相同的触发,进而只进行一次的任务分发。

结合图 1,如果要做到任务去重,系统至少需要提供两个维度的保障:

1、系统侧保障:任务调度系统自身的 failover 不影响消息的传递正确性及唯一性;

2、提供给用户一种机制,可以做到整个业务逻辑的触发去重语义。

下面,我们将结合简化的 Serverless Task 系统架构,谈一谈函数计算是如何做到上面的能力的。

函数计算异步任务触发去重的实现

函数计算的任务系统架构如下图所示

 图 2

首先,用户调用函数计算 API 下发一个任务(步骤 1)进入系统的 API-Server 中,API-Server 进行校验后将消息传入内部队列(步骤 2.1)。后台有一个异步模块实时监听内部队列(步骤 2.2),之后调用资源管理模块获取运行时资源(步骤 2.2-2.3)。获取运行时资源后,调度模块将任务数据下发到 VM 级别的客户端中(步骤 3.1),并由客户端将任务转发至实际的用户运行资源(步骤 3.2)。为了做到上文中所提到的两个维度的保障,我们需要在以下层面进行支持:

1、系统侧保障:在步骤 2.1 - 3.1 中,任何一个中间过程的 Failover 只能触发一次步骤 3.2 的执行,即只会调度一次用户实例的运行;

2、用户侧应用级别去重能力:能够支持用户多次反复执行步骤 1,但实际只会触发一次 步骤 3.2 的执行。

系统侧优雅升级 & Failover 时的任务分发去重保证

当用户的消息进入函数计算系统中(即完成步骤 2.1)后,用户的请求将收到 HTTP 状态码 202 的 Response,用户可以认为已经成功提交一次任务。从该任务消息进入 MQ 起,其生命周期便由 Scheduler 维护,所以 Scheduler 的稳定性及 MQ 的稳定性将直接影响系统 Exactly Once 的实现方案。

在大多数开源消息系统中(如 MQ、Kafka)一般都提供消息多副本存储及唯一消费的语义。函数计算所使用的消息队列(最底层为 RocketMQ)也是同样的,底层存储的 3 副本实现使得我们无需关注消息存储方面的稳定性。除此之外,函数计算所使用的的消息队列还具有以下特性:

1、消费的唯一性:每一个队列中的每一条消息当被消费后,会进入“不可见模式”。在此模式下,其他消费者无法获取该消息;

2、每条消息的实际消费者需要实时更新该模式的不可见时间;当消费者消费完成后,需要显示的删除该消息。因此,消息在队列中的的整个生命周期如下图所示:

图3

Scheduler 主要负责消息的处理,其任务主要有以下几个部分组成:

1、根据函数计算负载均衡模块的调度策略,监听自身所负责的队列;

2、当队列中出现消息后,拉取消息,并在内存中维持一个状态:直到消息消费完成(用户实例返回函数执行结果)前,不断更新消息的可见时间,确保消息不会再次在队列中出现;

3、当任务执行完成后,显示删除该消息。

在队列的调度模型方面,函数计算对于普通用户采用“单队列”的管理模式;即每一个用户的所有异步执行请求由一个独立队列相互隔离,并且由一个 Scheduler 固定负责。这个负载的映射关系由函数计算的负载均衡服务进行管理,如下图所示(我们在后续文章中还会更为详细的介绍这部分内容):

图 4

当 Scheduler 1 发生宕机或升级时,任务由两种执行状态:

1、如果消息还未传递到用户的执行实例中(图 2 中的步骤 3.1 ~ 3.2),那么当这台 Scheduler 负责的队列被其他 Scheduler 拾起后,消息将在消费可见期后再次出现,因此 Scheduler 2 将再次获取该消息,做到后续的触发。

2、如果消息已经开始执行(步骤 3.2),当消息在 Scheduler 2 中再次出现后,我们依赖用户 VM 中的 Agent 进行状态管理。此时 Scheduler 2 将向对应的 Agent 发送执行请求;此时 Agent 发现该消息已经存在于内存中,那么将直接忽略执行请求,并将执行的结果在执行后通过此链接告知 Scheduler 2,进而完成 Failover 的恢复。

用户侧业务级别的分发去重实现

函数计算系统能够做到对于单点故障下的每条消息准确的消费能力,但是如果用户侧对于同一条业务数据反复触发函数执行的话,函数计算无法识别不同消息是否在逻辑上是同一个任务。这种情况往往发生在网络分区。在图 2 中,如果用户调用 1 发生超时,此时有可能有两种情况:

1、消息未到达函数计算系统,任务未成功提交;

2、消息已经到达函数计算并入队,任务提交成功,但由于超时用户无法得知提交成功的信息。

大多数情况下用户会对此次的提交进行重试。如果是第 2 种情况,那么同一个任务将被提交并执行多次。因此函数计算需要提供一种机制,保证这种场景下业务的准确性。

函数计算提供了 TaskID 这一任务概念(StatefulAsyncInvocationID)。该 ID 全局唯一。用户每次提交任务均可以指定这样一个 ID。当发生请求超时时,用户可以进行无限次重试。所有的重复重试将在函数计算侧进行校验。函数计算内部使用 DB 对任务 Meta 数据进行存储;当有相同 ID 进入系统时该次请求将被拒绝,并返回 400 错误。此时客户端即可得知任务的提交情况。

在实际使用中以 Go SDK 为例,您可以编辑如下触发任务的代码:

import fc "github.com/aliyun/fc-go-sdk"func SubmitJob() {invokeInput := fc.NewInvokeFunctionInput("ServiceName", "FunctionName")invokeInput = invokeInput.WithAsyncInvocation().WithStatefulAsyncInvocationID("TaskUUID")invokeOutput, err := fcClient.InvokeFunction(invokeInput)...
}

便提交了一个独一无二的任务。

总结

本文介绍了函数计算 Serverless Task 对于任务触发去重的相关技术细节,以便支持对于任务执行准确性有严格要求的场景。在使用 Serverless Task 后,您无需担心任何系统组件的 Failover,您每次提交的任务将被准确执行一次。为了支持业务侧语义的分发去重,您可以在提交任务时设置任务的全局唯一 ID,使用函数计算提供的能力帮您对任务进行去重处理。

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

阿里云混合云建管用一体化探索实践 助力政企从容应对数字化转型难题

随着十四五规划强调打造数字经济新优势,将云计算列为数字经济重点产业,明确了以混合云为重点的云服务产业发展路线:“以混合云为重点培育行业解决方案、系统集成、运维管理等云服务行业”,混合云成为产业内众多服务商和政企客户关…

蚂蚁集团升级“绿色计算”,双11期间减排效果同比增长140%

“双11”正在全面进入“晚八点”时代,顺滑体验得力于保障技术的升级。 今年双11期间,蚂蚁集团通过应用“绿色计算”技术体系,有效提高算力、降低服务器需求压力。经中环联合认证中心(CEC)测算,在2022年双1…

如果有一天不做前端了,我会做什么?

毕业后就投身于前端行业,这期间做过业务,做过基建,大前端技术体系下的各个子方向基本都实践过。回过头来看,与刚进入前端行业时相比,对前端行业的认识更清晰了,但也发现困惑更多了,追求的东西好…

深入浅出eBPF|你要了解的7个核心问题

过去一年,ARMS基于eBPF技术打造了Kubernetes监控,提供多语言无侵入的应用性能,系统性能,网络性能观测能力,验证了eBPF技术的有效性。eBPF技术和生态发展很好,未来前景广大,作为该技术的实践者&a…

蚂蚁集团数字科技六大新品发布,以数助实赋能产业数字化

作者 | 伍杏玲 出品 | CSDN 产业数字化作为数字经济的核心引擎,与以往的信息化转型不同,如何通过通过大数据、人工智能、云计算、区块链等技术,实现“从数据中来,到实体中去”的目标,是科技公司一直在思考之事。 蚂…

阿里可观测性数据引擎的技术实践

一 前言 可观测性这个概念最早出现于20世纪70年代的电气工程,核心的定义是: A system is said to be observable if, for any possible evolution of state and control vectors, the current state can be estimated using only the information from…

618 大促来袭,浅谈如何做好大促备战

如何有效利用云产品做好我们的业务大促备战,这是一个大家都比较关心的问题。今天趁着 618 大促来袭前,谈一谈我们所积累的最佳实践。 点击链接,立即查看视频讲解:https://yqh.aliyun.com/live/detail/28697 大促的不确定性挑战 …

以数为基,云启健康未来|“对标世界一流管理——走进一心堂暨生命科学行业峰会”圆满落幕

11月12日,由金蝶软件(中国)(以下简称“金蝶”)主办的2022全球创见者大会之“对标世界一流管理——走进一心堂暨生命科学行业峰会”在云南昆明顺利举办。金蝶携手众多企业经营管理者,业界思想领袖及先锋企业…

Java 应用压测性能问题定位经验分享

什么是压测 压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和和可能存在的隐患。 压测主要用于检测服务器的承受能力,包括用户承受能力,即多少用户同…

异步任务处理系统,如何解决业务长耗时、高并发难题?

当我们构建一个应用,总是希望它是响应迅速,成本低廉的。而在实际中,我们的系统却面临各种各样的挑战,例如不可预测的流量高峰,依赖的下游服务变得缓慢,少量请求却消耗大量 CPU/内存资源。这些因素常常导致整…

将绿色计算进行到底,蚂蚁集团四大硬核黑科技全公开

作者 | 伍杏玲 出品 | CSDN 在红包和优惠券齐飞的热闹气氛下,第14个“双11”正式结束。可能大家意料不到的是,你在买单时,绿色计算为降低碳排放“买单”,打造绿色低碳的双 11。 看到这,你可能有疑问,自…

EasyNLP 带你玩转 CLIP 图文检索

导读 随着自媒体的不断发展,多种模态数据例如图像、文本、语音、视频等不断增长,创造了互联网上丰富多彩的世界。为了准确建模用户的多模态内容,跨模态检索是跨模态理解的重要任务,采用一种模态的数据作为数据,检索另…

美国国家安全局督促弃用 C/C++,使用更安全的 Rust、C# 等!

作者 | 苏宓出品 | CSDN(ID:CSDNnews)如果说此前 Kotlin、Dart、Julia、Carbon 等后起之秀向老牌编程语言发起挑战进攻都是小打小闹,那么这一次 C、C 这几种常青藤编程语言则是真实地陷入了尴尬的境地。近日,美国国家安…

DataFunTalk:阿里建设一站式实时数仓的经验分享

导读:大数据计算正从规模化走向实时化,实时大数据建设过程中开始面临很多的痛点和问题。本文内容整理于阿里资深技术专家姜伟华在DataFunTalk上的演讲,为大家介绍阿里巴巴基于一站式实时数仓Hologres建设实时数仓的经验和解决方案。 分享的内…

什么是真正的敏捷开发?敏捷开发与瀑布开发有何不同

什么是真正的敏捷开发?敏捷开发与瀑布开发有何不同。从本质上讲敏捷开发的一个重要目标是建立持续价值交付的能力。这种能力最终必须服务于业务的创新,促进业务的成功。 敏捷开发的目标——更早的交付 我们经常会说敏捷模式,那什么开发模式…

服务了 300 万微信开发者的这款产品,又升级了

从云开发到低代码甚至零代码,技术领域在发生快速的变化,腾讯、阿里、华为等云厂商也在持续布局。作为一线技术开发者,“不懂云开发或者低代码,在未来甚至都找不到工作”,绝不是危言耸听。由于背靠微信生态,…

基于 EasyCV 复现 ViTDet:单层特征超越 FPN

欢迎使用我们最近开源的EasyCV,主要聚焦于最新的Vision Transformer模型,以及相关的下游CV任务 开源地址: https://github.com/alibaba/EasyCV ViTDet其实是恺明团队MAE和ViT-based Mask R-CNN两个工作的延续。MAE提出了ViT的无监督训练方法…

数据湖构建—如何构建湖上统一的数据权限

背景信息 阿里云数据湖构建产品(DLF)提供的统一元数据服务,通过完善各种引擎/表格式生态解决了数据湖场景下多引擎面临的数据孤岛和元数据一致性问题,实现了开源大数据引擎及数据湖格式元数据的统一视图,避免了各引擎…

从阿里云容器攻防矩阵API安全生命周期,看如何构建金融安全云原生平台

【编者按】云原生技术正在助力银行通过差异化业务进行创新,却也带来了由于研发/运维人员对新架构不熟悉所导致的基础设施风险、业务风险及数据暴露风险。如何在飞速更迭的技术环境下保持业务持续发展,同时保证业务整体的安全性,满足不断增强的…

StarRocks X Flink CDC,打造端到端实时链路

实时数仓建设背景 实时数仓需求 随着互联网行业的飞速发展,企业业务种类变得越来越多,数据量也变得越来越大。以 Apache Hadoop 生态为核心的数据看板业务一般只能实现离线的业务。在部分领域,数据实时处理的能力已经成为限制企业数据变现的…