会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 函数计算异步任务能力介绍-任务触发去重!

函数计算异步任务能力介绍-任务触发去重

时间:2025-11-05 03:57:58 来源:益强数据堂 作者:人工智能 阅读:629次

作者 |  渐意

一、函数前言

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

二、函数浅谈任务去重

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

图 1

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

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

At-Most-Once:保证消息最多被传递一次。当出现网络分区、系统组件宕机时,可能出现消息丢失;At-Least-Once:保证消息至少被传递一次。消息传递链路支持错误重试,利用消息重发机制保证下游一定收到上游消息,但是在宕机或者网络分区的场景下,可能导致相同消息传递多次。Exactly-Once 机制则可以保证消息精确被传送一次,精确一次并不是意味着在宕机或网络分区的场景下没有重传,而是重传对于接受方的状态不产生任何改变,与传送一次的结果一样。在实际生产中,往往是依赖重传机制 & 接收方去重(幂等)来做到 Exactly Once。

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

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

系统侧保障:任务调度系统自身的 failover 不影响消息的传递正确性及唯一性;提供给用户一种机制,可以结合业务场景,做到整个业务逻辑的触发+执行去重。

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

三、函数计算异步任务触发去重的实现背景

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

图 2

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

系统侧保障:在步骤 2.1 - 3.1 中,任何一个中间过程的 Failover 只能触发一次步骤 3.2 的执行,即只会调度一次用户实例的运行;用户侧应用级别去重能力:能够支持用户多次反复执行步骤 1,但实际只会触发一次 步骤 3.2 的执行。1.系统侧优雅升级 & Failover 时的任务分发去重保证

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

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

消费的唯一性:每一个队列中的每一条消息当被消费后,会进入“不可见模式”。在此模式下,其他消费者无法获取该消息;每条消息的实际消费者需要实时更新该模式的不可见时间;当消费者消费完成后,需要显示的删除该消息。

因此,消息在队列中的的整个生命周期如下图所示:

图 3

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

根据函数计算负载均衡模块的调度策略,监听自身所负责的队列;当队列中出现消息后,拉取消息,并在内存中维持一个状态:直到消息消费完成(用户实例返回函数执行结果)前,不断更新消息的可见时间,确保消息不会再次在队列中出现;当任务执行完成后,显示删除该消息。

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

图 4

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

如果消息还未传递到用户的执行实例中(图 2 中的步骤 3.1 ~ 3.2),那么当这台 Scheduler 负责的队列被其他 Scheduler 拾起后,消息将在消费可见期后再次出现,因此 Scheduler 2 将再次获取该消息,做到后续的触发。如果消息已经开始执行(步骤 3.2),当消息在 Scheduler 2 中再次出现后,我们依赖用户 VM 中的 Agent 进行状态管理。此时 Scheduler 2 将向对应的 Agent 发送执行请求;此时 Agent 发现该消息已经存在于内存中,那么将直接忽略执行请求,并将执行的结果在执行后通过此链接告知 Scheduler 2,进而完成 Failover 的恢复。

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

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

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

大多数情况下用户会对此次的提交进行重试。如果是第 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,使用函数计算提供的能力帮您对任务进行去重处理。

(责任编辑:系统运维)

最新内容
推荐内容
  • 利用灯泡测试教程,轻松了解电脑的工作原理(通过灯泡测试教程,揭秘电脑内部的神秘世界)
  • Ubuntu 14.10已于前段时间发布。想知道如何从 Ubuntu 14.04 升级到 Ubuntu 14.10 么?别担心,这很容易做到。事实上,只要网络连接速度好,升级只是点击几下鼠标的事情而已。你需要从 Ubuntu 14.04 切换到 Ubuntu 14.10 么  在你升级到Ubuntu 14.10之前,请确定你真的想为升级 14.10 而抛弃 Ubuntu 14.04。一个很重要的原因是你不能从Ubuntu 14.10 回归到14.04。 你需要完全重新安装。Ubuntu 14.04是长期支持(LTS)版本。这意味着有更多的稳定性和更长的支持周期。假如升级到14.10,你将被迫在9个月后从Ubuntu 14.10 升级到15.04,而14.04将会持续3年以上。此外,目前Ubuntu 14.10没有很多的新功能使吸引用户切换到14.10。当然了,你肯定会得到最前沿的操作系统。所以,在这之前是否升级到Ubuntu 14.10是你自己的决定。从Ubuntu 14.04 升级到 Ubuntu 14.10 要从Ubuntu 14.04 升级到 Ubuntu 14.10,遵循下面的步骤:步骤 1: 打开 软件和更新.进入更新选项卡。这里要确保Ubuntu有新版本时通知我 设置成对于任何新版本。默认Ubuntu只会在另一个LTS发布时通知你。你必须要把它改成在任何中间版本都升级。步骤 2: 现在运行 软件升级。升级完成后,它应该会提示一个可用的新版本。点击升级,接着按照提示的步骤来。我希望该文教程可以帮助你从 Ubuntu 14.04 升级到 Ubuntu 14.10。虽然本教程是为Ubuntu写的,但是你可以用同样的步骤升级到 Xubuntu 14.10、Kubuntu 14.10 或者Lubuntu。敬请期待下一篇Ubuntu 14.10相关文章。谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。
  • 方法一:安装gcc4.4和g++4.4复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:lrwxrwxrwx 1 root root      7 2011-08-14 15:17 /usr/bin/gcc ->gcc-4.7-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 /usr/bin/gcc-4.4-rwxr-xr-x 1 root root 237072 2011-09-17 17:25 /usr/bin/gcc-4.5-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 /usr/bin/gcc-4.6由上面显示可以看出默认安装的是gcc-4.7,现在来改成gcc-4.4删除gcc-4.7的软连接文件/usr/bin/gcc。(只是删除软连接)命令:sudo rm /usr/bin/gcc然后建一个软连接,指向gcc-4.4。命令:sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
  • 在Ubuntu中怎么安装JDK图文解析,对于很多不知道怎么操作的朋友可以参考本文,希望能给大家带来帮助!方法/步骤1,到Oracle官网下载相关的JDK2,假设jdk安装文件在桌面,我们指定的安装目录是:/usr/local/java 。可是系统安装后在/usr/local下并没有java目录,这需要我们去创建一个java文件夹3,打开终端(terminal)切换到桌面下,执行复制sudo cp jdk-6u30-linux-i586.bin /usr/local/java/安装jdk:切换到root用户下,(注:假如因忘记密码而认证失败,可以先修改root用户的密码,再执行,修改root用户密码如图)更改jdk-6u30-linux-i586.bin权限运行jdk-6u30-linux-i586.bin当看到下图情况时,说明你安装成功了。这时在/usr/local/java目录下就多了一个jdk1.6.0_30文件夹,可以查看一下注:假如因忘记密码而认证失败,可以先修改root用户的密码,再执行,修改root用户密码以上就是在Ubuntu中怎么安装JDK图文解析教程,大家看明白了吗?主要大家按照上面的步骤进行,即可成功安装JDK,希望能对大家有所帮助!
  • 电脑主机配置和安装教程(从零开始学习电脑主机配置和安装,让你的电脑运行更流畅)
  • Ubuntu是一个以桌面应用为主的Linux操作系统,是linux平台下很受欢迎的系统。Putty是Windows上常用的登录Linux的终端工具。登录终端如图系统内登录终端一样。默认情况下,ubuntu终端上显示的中文字符常常是乱码。下面就说下,如何解决Putty登录Ubuntu中文显示乱码问题。1、在使用putty连接登录Linux时,发现了终端下显示乱码,如下图所示。2、之后,在终端下输入echo $LANG $LANGUAGE,回测。之后即可看到en_US、UTF-8。这个信息说明该系统下支持这两种字符集。3、之后,选择标题,右击选择菜单中的“Change Settings”选项。4、之后,进入到putty的设置页面。同时,也可以直接双击putty运行程序,进入到设置页面。5、进入到设置页面之后,选择左侧点击【Window】下的“Translation”选项,之后在右侧会看到“Remote character set:”选项。6、通过下拉菜单,选择“UTF-8”字符集选项。7、之后,再次在终端下输入相应的指令,即可看到显示正常的中文编码了。8、最后,下次登录服务器只要双击putty.exe,然后在页面中输入IP以及端口(默认22即可),然后【Open】就可以连接ubuntu服务器了。连接服务器需要进行身份验证,输入系统的用户名以及密码。注意事项:中文乱码的解决也需要系统的支持,本经验验证是在ubuntu下进行的。
热点内容