基于 Serverless 工作流高并发批量解冻 OSS 文件

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介:

前言

Serverless 工作流(Serverless Workflow,原函数工作流)是一个用来协调多个分布式任务执行的全托管 Serverless 云服务,致力于简化开发和运行业务流程所需要的任务协调、状态管理以及错误处理等繁琐工作,让用户聚焦业务逻辑开发。用户可以用顺序、分支、并行等方式来编排分布式任务,服务会按照设定好的顺序可靠地协调任务执行,跟踪每个任务的状态转换,并在必要时执行用户定义的重试逻辑,以确保工作流顺利完成。

函数计算 FC 是事件驱动的全托管计算服务,无需采购服务器和运维,只需上传代码就能实现高可用、高并发、弹性伸缩的后端服务。

本文介绍如何使用 Serverless 工作流来高并发大批量的解冻 oss 归档存储文件,使用工作流的优势:

  • 高并发
  • 错误自动重试,高可靠性
  • 每个步骤都有输入输出记录以及实时执行状态,高可观测性

应用中心一键部署

  1. 前往 Serverless 工作流应用中心 创建并部署 OSS Restore 应用。
    image
  2. 部署完成后执行流程 {stackName}-mainRestoreFlow-{suffix},输入:

    {
      "endpoint": "",
      "bucketName": "",
      "prefix": "",
      "marker": "",
      "maxKeys": 100,
      "pollInterval": 10,
      "workers": 10,
      "groupSize": 1
    }

    执行参数说明:

    • endpoint
      OSS endpoint
    • bucketName:
      OSS bucket 名称
    • prefix:
      OSS bucket 文件过滤前缀
    • maxKeys:
      OSS ListObjects 返回的最大文件数量 (这里不要超过 foreach 的并发限制,默认是 100)
    • pollInterval:
      轮询 OSS 文件 restore 状态的时间间隔(秒)
    • groupSize:
      一个任务步骤(对应一个函数)批量处理的文件数
    • workers:
      多个文件在一个函数中处理时,设定的处理线程池大小
    • marker:
      OSS ListObjects 的开始 marker

    详细信息可参考 ListObjects API

流程执行完毕后,会自动解冻所有符合过滤条件的归档存储文件。

原理

解冻文件主流程

主流程 mainRestoreFlow 主要做以下事情:

  1. 任务步骤 listArchiveFiles 调用 FC 函数 listArchiveFilesmarker 开始执行 ListObjects 列举指定 maxKeys 数量,前缀为 prefix 的 OSS 文件。
  2. 调用子流程 restoreFlow 对获取的文件列表进行解冻,并返回下一次列举的起点 maker
  3. 选择步骤 checkEnd 检测是否已完成列举 bucket 中所有的文件,若没有,跳转到 listArchiveFiles 中从下一个 marker 开始继续执行,否则结束。

主流程定义,请参考 流程定义语言

version: v1
type: flow
steps:
- type: pass
  name: init
  outputMappings:
    - source: $input.endpoint
      target: endpoint
    - source: $input.bucketName
      target: bucketName
    - source: $input.prefix
      target: prefix
    - source: $input.maxKeys
      target: maxKeys
    - source: $input.pollInterval
      target: pollInterval
    - source: $input.marker
      target: marker
    - source: $input.workers
      target: workers
    - source: $input.groupSize
      target: groupSize

# List archive files from marker
- type: task
  name: listArchiveFiles
  resourceArn: acs:fc:::services/<serviceName>/functions/listArchiveFiles
  outputMappings:
    - source: $local.bucketName
      target: bucketName
    - source: $local.filesGroup
      target: filesGroup
    - source: $local.marker
      target: marker
    - source: $local.end
      target: end
    - source: $local.empty
      target: empty
    - source: $local.archiveFilesCount
      target: archiveFilesCount

# Check whether file restore success, if not, retry check
- type: choice
  name: checkEmpty
  choices:
    # If list archive files not empty
    - condition: $.empty == "false"
      steps:
        # Invoke subflow restore to restore listed files
        - type: task
          name: invokeRestoreFlow
          resourceArn: acs:fnf:::flow/<restoreFlow>
          pattern: sync
          serviceParams:
            Input: $
  default:
    goto: checkEnd

# Check list files ended
- type: choice
  name: checkEnd
  choices:
    - condition: $.end == "true"
      goto: success
  default:
    goto: listArchiveFiles

# success
- type: pass
  name: success

解冻文件子流程

子流程 restoreFlow 主要做以下事情:

  1. 并行循环步骤 foreach,并行的对主流程中传入的文件列表生成多个解冻任务。
  2. 解冻任务 restoreTask 调用 FC 函数 restore 对文件列表进行解冻。
  3. 所有解冻任务提交完成后,循环执行:

    • 等待步骤 Wait 等待一段时间
    • 任务步骤 GetJobStatus 获取所有文件的解冻状态
    • 选择步骤 CheckJobComplete 判断是否全部解冻完成,若完成执行结束,否则跳转到 wait 步骤继续循环检测。

子流程定义如下:

version: v1
type: flow
steps:
  - type: foreach
    name: retoreForeach
    iterationMapping:
      collection: $.filesGroup
      item: files
    steps:
      # Invoke restore function
      - type: task
        name: restoreTask
        resourceArn: !Ref OSSRestoreService/restoreFunction
        retry:
          - errors:
              - FC.ResourceThrottled
              - FC.ResourceExhausted
              - FC.InternalServerError
              - FC.Unknown
              - FnF.TaskTimeout
            intervalSeconds: 1
            maxAttempts: 10
            multiplier: 1.5
            maxIntervalSeconds: 10

  # Wait interval for poll files restore status
  - type: wait
    name: Wait
    duration: $.pollInterval

  # Get file restore status
  - type: task
    name: GetJobStatus
    resourceArn: !Ref OSSRestoreService/restoreStatusFunction

  # Check whether file restore success, if not, retry check
  - type: choice
    name: CheckJobComplete
    inputMappings:
      - target: status
        source: $local.status
    choices:
      - condition: $.status == "success"
        goto: JobSucceeded
      - condition: $.status == "running"
        goto: Wait

  - type: succeed
    name: JobSucceeded
    outputMappings:
      - target: filesGroup
        source: $input.filesGroup
      - target: marker
        source: $input.marker

以上应用代码可参考 oss-restore

总结

使用 Serverless 工作流能极大减少重复的流程控制开发,让错误重试更加容易,以及提供实时的执行进度查询。这里提供的解冻 oss 应用,完全可以照搬到其它的需求上,以实现高并发高可靠性的应用。

欢迎加钉钉群 23116481 交流:
image

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
3月前
|
消息中间件 存储 Serverless
函数计算产品使用问题之怎么访问网络附加存储(NAS)存储模型文件
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
存储 人工智能 运维
函数计算产品使用问题之怎么识别并清理文件中转站中的无用文件
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
JavaScript Serverless 数据安全/隐私保护
函数计算产品使用问题之怎么动态设置.npmrc文件以配置私有仓库访问
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
消息中间件 弹性计算 关系型数据库
体验函数计算:高效处理多媒体文件的真实感受与实战总结
该方案在引导和文档方面做得较为详尽,仅在事件驱动机制部分略显简略。部署和代码示例实用,但需注意内存配置以避免超时。使用体验方面,函数计算表现出色,尤其在高并发场景下,显著提升了应用稳定性和成本效益。云产品如OSS、MNS等与函数计算配合流畅,ECS和RDS表现稳健。总体而言,这套方案弹性好、成本低,特别适合应对高并发或流量不确定的场景,值得推荐。
68 24
|
3月前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之上传素材文件不在同一地域的OSS,怎么上传多张图片
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
46 1
|
3月前
|
消息中间件 关系型数据库 Serverless
【阿里云】一键部署创建函数计算服务以处理多媒体文件
通过阿里云的一键部署功能,轻松创建函数计算服务以处理多媒体文件。首先选择地域并配置资源栈名称及其他必要参数,如登录凭证、实例类型及数据库配置。过程中可能需开通相关服务如消息服务MNS,并确保账户有足够的余额。完成配置后,系统自动创建资源栈。当状态显示“创建成功”即部署完毕。最后,通过提供的URL及凭据访问应用,上传PPTX文件进行处理,并下载处理后的结果。
81 5
|
3月前
|
存储 前端开发 Serverless
Serverless 魔法之旅:如何用 Funcraft、OSS 和 ROS 打造超级CI/CD流水线!
【8月更文挑战第8天】在现代软件开发中,CI/CD对于提升效率与代码质量至关重要。本文介绍如何运用阿里云的Serverless服务——Funcraft、OSS及ROS构建完整的CI/CD流程。首先配置Funcraft实现代码自动化构建与部署;接着利用OSS管理静态文件,确保网站内容正确加载;最后借助ROS自动化资源创建与管理,实现代码自动部署。通过整合这些服务,不仅加速了开发进程,还保证了代码质量和部署一致性,充分发挥Serverless架构的优势。
61 5
|
4月前
|
运维 Kubernetes Serverless
Serverless 应用引擎使用问题之s.yaml文件中如何使用外部环境变量
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
存储 缓存 运维
函数计算产品使用问题之如何将外部环境变量放到s.yaml文件中使用
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
存储 运维 Serverless
函数计算产品使用问题之OSS触发器是否可以只设置文件前缀
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。

热门文章

最新文章

相关产品

  • 函数计算