Serverless 工作流 + 函数计算批量处理海量 OSS 文件最佳实践

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
函数计算FC,每月免费额度15元,12个月
简介:

背景介绍

OSS 简单的接口和卓越的可扩展性让不同场景的应用程序每天可以轻松存储几个到几十亿个对象文件。简单的 key/value 数据访问结构极大地简化了数据的上传和读取。然而,除了上传和读取,很快就围绕 OSS 产生了一系列新的应用场景,举几个例子:

  • 海量 OSS 文件复制 (bucket 内或跨 bucket),改变存储类型(标准 -> 归档)节省成本
  • 大并发 OSS 文件解冻(restore)将备份的归档文件恢复后供应用使用
  • 事件触发超大文件解压,GB 级别压缩包,包含十万级别以上的文件需要在上传后被自动解压到一个新的 OSS 路径下

上面 3 类场景有一些有共性的挑战:

  1. 总处理时间长: 处理亿级别的 OSS 文件数即使是高并发访问 OSS, 总耗时也是天级别甚至更长
  2. 大量远程调用可能产生的异常处理:由于 OSS API 基本都是操作单个文件,处理几百万到几千万个文件就意味着等数量级的远程调用。在分布式系统中,这些远程调用失败都需要处理。
  3. 状态持久化:需要有类似 checkpoint 的机制减少在部分失败的情况下全部重新处理,避免浪费时间 (如批量处理可以跳过已经处理过的前 1000 万个 key)。

在这篇文章中我们将就上面提到的 3 个场景介绍一个基于 Serverless 工作流和函数计算(FC)无服务器最佳实践解决方案。

海量 OSS 文件复制 + 归档

OSS 文件备份听起来是一个简单的 list-and-copy 的主程序就可以搞定的问题,现实中有非常多的问题需要考虑:例如主程序运行中如果机器宕机或者进程异常退出后,如何自动恢复(自己实现高可用)?恢复后如何快速已经被处理过的文件 (自己写数据库维护状态)?如何协调主备进程 (自己实现服务发现)?如何缩短复制时间? (自己实现并行调用和管理) 基础设施的维护成本和经济成本和可靠性如何取舍?在几亿个 OSS 对象面前,一个简单的单线程 list-and-copy 的主程序已经无法可靠地满足这类需求。

假设用户某 bucket 下有几亿 OSS 文件需要被复制到同一 region 不同 bucket 下,且需要将标准存储类型转换成归档存储。 在这个 oss-batch-copy 示例 中,我们提供了一个工作流应用模板将用户提供的索引文件中的所有文件依次调用函数计算 OSS CopyObject 操作实现备份。索引文件中包含需要被处理的 OSS object meta,示例如下:

oss_files_index

几亿个 OSS 文件的索引也会在百 GB 级别,因此需要利用 range 读分页读取索引文件,每次处理一部分 OSS 文件并且需要一个类似 while hasMore {} 的控制逻辑保证整个索引文件从头到尾被处理。使用 Serverless 工作流的实现逻辑如下:

  1. copy_files 任务步骤:从输入的索引文件位置 (offset) 读取一段输入提供的长度 (size)从中提取需要被处理的文件并调用 FC 函数调用 OSS CopyObject
  2. has_more_files 选择步骤:成功处理完一批文件后,通过条件比对判断当前索引文件是否已经被全部处理,是则进入成功步骤,否则将下一页(offset, size)传入 copy_files 循环执行。
  3. start_sub_flow_execution 任务步骤:由于单个工作流执行有历史事件(history events)数限制,在该选择步骤也会根据当前工作流的事件 ID 判断,如果当前事件数已经超过一个阈值,则触发一个新的相同的流程执行,该流程会在子流程结束后继续进行。子流程也可能触发它的子流程,这样层层递归保证了无论多少 OSS 文件,整个流程都可以处理完成。

oss_copy

使用工作流实现批量处理提供了如下保证:

  1. 单次处理的时间几乎可以任意长度,任意多的文件数:工作流支持最长 1 年的执行
  2. 免运维,无需自行实现高可用:工作流和函数计算都是高可用的 Serverless 云服务
  3. 无需自己实现 checkpoint, 状态维护等逻辑:如果因为任何原因流程失败,可以重新从最近成功的一个 offset 开始执行。这过程中不需要使用任何的数据库或者队列。
  4. 失败重试配置:通过指数退避的配置可以处理大多数的瞬时远程调用错误。

高并发批量解冻 OSS 文件

文章基于 Serverless 工作流高并发批量解冻 OSS 文件介绍了一种高效可靠解冻大量 OSS 归档文件的解决方案。该场景和复制文件有类似的挑战,但也有其特殊性:

  1. 和 CopyObject 不同,Restore 操作是异步的,即触发后需要轮询该对象状态才能能确保解冻完成
  2. 单个对象解冻时间在分钟级,可能随着对象大小变化。这要求整个流程有更高的并发保证解冻在规定的时间内完成。

和 oss-batch-copy 类似的逻辑,该示例通过 ListObjects 分批 restore OSS,其中每一批解冻都是一个子流程。在每个流程中使用 foreach 并行循环步骤 高并发解冻 OSS 对象(最高 100 并发)。由于 Restore 接口是异步操作,因此在每次 Restore 过后需要轮询该 object 的状态直到解冻完成。解冻和轮询在同一个并发分支中完成。

oss_restore

使用工作流+函数计算批量解冻的特点:

  1. 天然支持高并发解冻,缩短整体耗时
  2. 有状态可靠的轮询确保流程结束时所有对象都解冻完成

事件驱动解压超大 OSS 文件

OSS 的一大作用是做文件的共享存储,如一方上传处理好的内容供下游应用使用。由于多个文件上传需要调用多次 PutObject 接口出错概率较大也不容易实现,很多上游服务使用压缩包用一个接口调用就完成上传。这样虽然简化了上传方,然而下游的使用方希望看到的是维持原本结构的文件以便消费。这里的需求就是响应 OSS 文件上传事件,自动将一个压缩包解压存放到另一个 OSS 路径。今天控制台上已经有一个通过事件触发函数计算执行解压的功能,然而目前单纯基于函数计算的方案有一些问题:

  1. 单个函数 10 分钟的执行时间限制:对于 GB 级别的压缩包,或者压缩包内有海量小文件的场景很容易执行超时导致解压失败
  2. 容错性低:OSS 异步调用函数计算,函数内访问 OSS 存在瞬时失败的可能,FC 异步调用在函数调用失败时会最多重试 3 次,超过次数后会丢弃消息导致解压失败。
  3. 灵活性不够:多个用户提出需要在解压后向消息服务发通知,发短信,以及删除原压缩包等自定义需求,基于单函数不易实现。

为了解决长时间执行和自定义重试的问题,我们在这个示例应用中引入 Serverless 工作流编排函数计算。OSS 事件触发函数计算后启动工作流执行。工作流会通过 ZIP 包的元数据流式读取、解压、上传到 OSS 目标路径。每个函数的执行时间超过一定阈值后即返回当前的 marker,工作流会判断当前 marker 是否表示所有文件处理完成,如果是则结束流程执行,否则继续从当前 marker 继续流式解压,直到结束。

drawio_oss_unzip

工作流的加入突破了函数调用10分钟的限制,并且自带的状态管理和自定义重试,即使是 GB 级别大小,10万级别文件数的压缩包也可以可靠地解压。工作流最长支持一年的执行,几乎任意大小的 ZIP 包都同样可以流式解压成功。

oss_unzip_retry

工作流为解压流程提供了灵活的定制化能力,下图是某用户的在解压结束后通知其 MNS 队列,通知结束后进入到下一步骤删除原压缩包。

flow_failed

Takeaways

可以看到 OSS 的大规模普及也带来了一系列问题,然而解决问题的方式又繁琐,无趣,易出错。本文我们就批量文件备份,大并发解冻和事件驱动解压超大 ZIP 文件 3 个常见场景介绍了基于 Serverless 工作流和函数计算的简单、轻量,Serverless 解决方案高效可靠地解决以下问题:

  1. 支持长时间运行的流程,最长执行一年不间断
  2. 状态维护,不受系统 failover 影响
  3. 提高瞬时错误忍度度
  4. 高度灵活自定义

海量 OSS 文件批量处理的场景远不止文中提到的 3 个,我们期待更多的场景和需求的讨论也同样欢迎对 Serverless 生态,工作流,函数计算有兴趣的同学加入内部钉钉群。

qr_code

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
5天前
|
数据采集 JSON Serverless
通过百炼大模型+FC函数计算构建小红书图文工作流
使用阿里云函数服务和百炼平台,快速构建小红书图文创作工作流。通过两步轻松创建: 1) 在函数计算中利用Puppeteer构建卡片生成服务; 2) 在百炼平台上创建工作流,整合大模型、脚本和函数计算节点,实现图文内容的自动化处理和生成。此方案适合高效创作小红书内容。
937 5
|
9天前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
10天前
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之在使用MaxCompute进行数据集成同步到OSS时,出现表名和OSS文件名不一致且多了后缀,该如何处理
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
11天前
|
运维 监控 Serverless
Serverless架构下的函数计算:重塑云计算的未来
【7月更文挑战第16天】Serverless架构下的函数计算作为云计算领域的一项重大创新,正以其独特的优势改变着应用开发和运维的方式。随着技术的不断成熟和完善,函数计算将在更多领域发挥重要作用,推动云计算技术向更加高效、灵活和智能的方向发展。对于开发者和企业来说,掌握函数计算技术将是把握未来云计算机遇的关键所在。
|
26天前
|
缓存 运维 监控
Serverless 应用引擎产品使用合集之在使用函数计算 FC 部署 stable-diffusion 应用时,选了 tagger 扩展插件却拿不到提示词,还报错“Error”,是什么原因
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
9天前
|
分布式计算 DataWorks 数据管理
DataWorks操作报错合集之使用OSS读取CSV文件到ODPS时遇到报错,一般是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
17天前
|
机器学习/深度学习 监控 Serverless
无服务器架构(Serverless)
无服务器架构(Serverless)
|
26天前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用合集之关于OSS映射目录的大小限制,如何可以跳过
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎产品使用合集之关于OSS映射目录的大小限制,如何可以跳过
|
24天前
|
分布式计算 Hadoop Serverless
数据处理的艺术:EMR Serverless Spark实践及应用体验
阿里云EMR Serverless Spark是基于Spark的全托管大数据处理平台,融合云原生弹性与自动化,提供任务全生命周期管理,让数据工程师专注数据分析。它内置高性能Fusion Engine,性能比开源Spark提升200%,并有成本优化的Celeborn服务。支持计算存储分离、OSS-HDFS兼容、DLF元数据管理,实现一站式的开发体验和Serverless资源管理。适用于数据报表、科学项目等场景,简化开发与运维流程。用户可通过阿里云控制台快速配置和体验EMR Serverless Spark服务。
|
26天前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之通过 API 调用 /tagger/v1/interrogate 时,出现unsupported protocol scheme "" 错误,如何处理
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。

相关产品

  • 函数计算