- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
摘要: 本文将以图片处理的场景作为例子详细描述当前的问题以及华为云FunctionGraph函数工作流在面对该问题时采取的一系列实践。
文章作者| 旧浪: 华为云Serverless研发专家、 平山: 华为云中间件Serverless负责人 。
企业应用从微服务架构向 Serverless(无服务器)架构演进,开启了无服务器时代,面向无服务器计算领域的 Serverless 工作流也应运而生。许多Serverless 应用程序不是由单个事件触发的简单函数,而是由一系列函数多个步骤组成的,而函数在不同步骤中由不同事件触发。Serverless工作流用于将函数编排为协调的微服务应用程序.
Serverless工作流由于自身可编排、有状态、持久化、可视化监控、异常处理、云服务集成等特性,适用于很多应用场景,比如:
当前大部分Serverless Workflow平台更多关注控制流程的编排,忽视了工作流中数据流的编排和高效传输,上述场景1-4中,由于数据流相对简单,所以各大平台支持都比较好,但是对于文件转码等存在超大数据流的场景,当前各大平台没有给出很好的解决方案。华为云FunctionGraph函数工作流针对该场景,提出了Serverless Streaming的流式处理方案,支持毫秒级响应文件处理。本文将以图片处理的场景作为例子详细描述当前的问题以及华为云FunctionGraph函数工作流在面对该问题时采取的一系列实践.
先以一个图片处理的场景举例,用户想要执行一个图片压缩并且加水印的任务,这个场景在典型的工作流系统中,可以用如图一所示的方式进行处理.
图1:一个典型的图片处理工作流 。
如上图所示,图片压缩和图片加水印的结果都是二进制文件格式,但是当前主流的Serverless Workflow平台在多个步骤之间传输上下文都只能支持文本格式传输,所以图片压缩和加水印的结果都需要经过BASE64或者其他转码方式转成文本进行数据流传输.
但是这种方案的限制和使用成本都比较高:
如何简单高效的进行文件处理,业界也给出了其他解决方案,如通过云存储进行中间结果转储、AWS的Lambda Object文件转换方案。下面给出了这两个方案的优缺点分析.
该方案如图2所示:
图2:云存储转储运行方式示意图 。
两个步骤之间的文件流通过云存储去传递,这种方案支持大文件流的传输,但是由于中间多了一次到云存储的网络传输,如果业务对时延要求不高,该方案问题不大, 但是对于时延敏感类业务,这种多出的时延是无法接受的。 另外云存储转储需要额外的成本,如果调用量比较大,使用成本较高.
图3:AWS解决方案示意图[1] 。
AWS对于这种文件处理场景,提出了基于S3和Lambda的Lambda Object的方案,参考[1],简单来说,是支持为S3文件桶的getObject API提供Access Point,AccessPoint可以指向某一个Lambda函数,在函数中可以对原来的桶数据文件进行修改,比如可以将原始视频转码,得到转码后的结果返回到客户端。虽然解决了时延和大文件处理的问题,但是这个方案强依赖S3的API, 用户无法进行流程编排,也无法通过事件触发 ,不是一个真正通用的方案.
简单总结如表1所示,当前业界提供的各个方案或多或少存在一些局限性,没有办法在同时满足 低时延 的情况下支持 可编排 的文件处理。然而低时延和可编排都是大量客户所追求的关键能力,如何解决这些关键痛点,提升客户体验,成为了当前我们重点想要攻克的难题.
表1:业界文件处理方案对比 。
针对当前业界缺少高效,可编排的文件处理方案的痛点,华为云FunctionGraph函数工作流提出Serverless Streaming的流式可编排的文件处理解决方案,步骤与步骤之间通过数据流驱动,更易于用户理解。本章通过图片处理的例子解释该方案的实现机制.
如果需要驱动一个工作流执行,工作流系统需要处理两个部分:
在普通的服务编排中,由于需要精准控制各个服务的执行顺序,所以控制流是工作流的核心部分。然而在文件处理等流式处理场景中,对控制流的要求并不高,以上述图片处理场景举例,可以对大图片进行分块处理,图片压缩和加水印的任务不需要严格的先后顺序,图片压缩处理完一个分块可以直接流转到下一个步骤,而不需要等待图片压缩把所有分块处理完再开始加水印的任务.
基于上述理解,华为云FunctionGraph工作流的Serverless Streaming方案架构设计如图四所示:
图4: Serverless Streaming流式处理架构图 。
在 Serverless Streaming的流程中,弱化控制流中步骤之间的先后执行顺序,允许异步同时执行,步骤与步骤之间的交互通过数据流驱动 。其中数据流的控制通过Stream Bridge组件来实现.
同时函数SDK增加流式数据返回接口,用户不需要将整个文件内容返回,而是通过gRPC Stream的方式将数据写入到Stream Bridge,Stream Bridge用来分发数据流到下一个步骤的函数Pod中.
这种方式存在如下优点:
当前FunctionGraph已经基于上述方案支持了在函数工作流中进行数据流处理,并且将结果通过流数据的方式返回到客户端,以构建一个图片处理工作流举例:
1、首先创建一个图片压缩的函数,其中代码在处理返回数据通过ctx.Write()函数将结果以流式数据的形式返回:
FunctionGraph通过ctx.Write()函数提供了流式返回的能力,对开发者来说,只需要将最终结果通过流的方式返回,而不需要关注网络传输的细节.
2、在函数控制台中启用该函数的流式返回能力 。
3、用上面的方式完成其他函数的编写,最后在FunctionGraph的函数流控制台完成工作流编排,举例如下:
4、调用工作流的同步执行接口,获取最终结果的文件流,数据将以chunked流式返回的方式返回到客户端 。
针对图片处理的具体场景,我们测试对比了不同大小图片(333k、1m、4m、7m、10m、12m)进行图片切割和图片压缩的场景,由于BASE64转码方案无法支持大文件,AWS Lambda Object方案无法支持编排,所以这里只对比使用OBS转储方案和基于流式返回的Servlerss Streaming方案的时延数据。具体对比数据图表如下:
图5:测试数据对比 。
响应时延:指客户端发出请求到收到第一个字节消耗的时延(单位:秒) 。
端到端时延:指客户端发出请求到收到最后一个字节消耗的时延(单位:秒) 。
从测试数据可以看出,响应时延和端到端时延使用流式返回方案后都得到了不同程度的降低。其中响应时延降低幅度较大,OBS转储方案响应时延随着图片大小增大,响应时延呈线性上升,超过4M的图片响应时延就达到秒级,使用流式返回方案后,响应时延持续稳定在毫秒级的水平。从中可以发现,基于Serverless Streaming的流式返回方案不仅具备 流式处理和可编排 的能力,并且在文件处理场景中可以 显著降低时延 ,从多个方面提升了用户使用体验.
本文主要讨论了Serverless Workflow在大文件处理时碰到的问题,FunctionGraph通过简化数据传输链路,提升文件流处理效率, 给出了一种稳定高效、极低时延的大文件处理方法 Serverless Streaming,支持毫秒级的文件流式处理, 显著改善函数编排在文件处理等场景中的用户体验.
FunctionGraph作为华为元戎加持的下一代Serverless函数计算与编排服务,将围绕通用全场景 Serverless的前沿理论及案例实践,持续分享,回馈社区.
[1] Introducing Amazon S3 Object Lambda 。
https://aws.amazon.com/cn/blogs/aws/introducing-amazon-s3-object-lambda-use-your-code-to-process-data-as-it-is-being-retrieved-from-s3/ 。
。
点击关注,第一时间了解华为云新鲜技术~ 。
最后此篇关于ServerlessStreaming:毫秒级流式大文件处理探秘的文章就讲到这里了,如果你想了解更多关于ServerlessStreaming:毫秒级流式大文件处理探秘的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
对于 Metal ,如果对主纹理进行 mipmap 处理,是否还需要对多采样纹理进行 mipmap 处理?我阅读了苹果文档,但没有得到任何相关信息。 最佳答案 Mipmapping 适用于您将从中
我正在使用的代码在后端 Groovy 代码中具有呈现 GSP(Groovy 服务器页面)的 Controller 。对于前端,我们使用 React-router v4 来处理路由。我遇到的问题是,通过
我们正在 build 一个巨大的网站。我们正在考虑是在服务器端(ASP .Net)还是在客户端进行 HTML 处理。 例如,我们有 HTML 文件,其作用类似于用于生成选项卡的模板。服务器端获取 HT
我正在尝试将图像加载到 void setup() 中的数组中,但是当我这样做时出现此错误:“类型不匹配,'processing .core.PImage' does not匹配“processing.
我正在尝试使用其私有(private)应用程序更新 Shopify 上的客户标签。我用 postman 尝试过,一切正常,但通过 AJAX,它带我成功回调而不是错误,但成功后我得到了身份验证链接,而不
如何更改我的 Processing appIconTest.exe 导出的默认图标在窗口中的应用程序? 默认一个: 最佳答案 经过一些研究,我能找到的最简单的解决方案是: 进入 ...\process
我在 Processing 中做了一个简单的小游戏,但需要一些帮助。我有一个 mp3,想将它添加到我的应用程序中,以便在后台循环运行。 这可能吗?非常感谢。 最佳答案 您可以使用声音库。处理已经自带
我有几个这样创建的按钮: 在 setup() PImage[] imgs1 = {loadImage("AREA1_1.png"),loadImage("AREA1_2.png"),loadImage
我正在尝试使用 Processing 创建一个多人游戏,但无法弄清楚如何将屏幕分成两个以显示玩家的不同情况? 就像在 c# 中一样,我们有Viewport leftViewport,rightView
我一直在尝试使用 Moore 邻域在处理过程中创建元胞自动机,到目前为止非常成功。我已经设法使基本系统正常工作,现在我希望通过添加不同的功能来使用它。现在,我检查细胞是否存活。如果是,我使用 fill
有没有办法用 JavaScript 代码检查资源使用情况?我可以检查脚本的 RAM 使用情况和 CPU 使用情况吗? 由于做某事有多种方法,我可能会使用不同的方法编写代码,并将其保存为两个不同的文件,
我想弄清楚如何处理这样的列表: [ [[4,6,7], [1,2,4,6]] , [[10,4,2,4], [1]] ] 这是一个整数列表的列表 我希望我的函数将此列表作为输入并返回列表中没有重复的整
有没有办法在不需要时处理 MethodChannel/EventChannel ?我问是因为我想为对象创建多个方法/事件 channel 。 例子: class Call { ... fields
我有一个关于在 Python3 中处理 ConnectionResetError 的问题。这通常发生在我使用 urllib.request.Request 函数时。我想知道如果我们遇到这样的错误是否可
我一直在努力解决这个问题几个小时,但无济于事。代码很简单,一个弹跳球(粒子)。将粒子的速度初始化为 (0, 0) 将使其保持上下弹跳。将粒子的初始化速度更改为 (0, 0.01) 或任何十进制浮点数都
我把自己弄得一团糟。 我想在我的系统中添加 python3.6 所以我决定在我的 Ubuntu 19.10 中卸载现有的。但是现在每次我想安装一些东西我都会得到这样的错误: dpkg: error w
我正在努力解决 Rpart 包中的 NA 功能。我得到了以下数据框(下面的代码) Outcome VarA VarB 1 1 1 0 2 1 1 1
我将 Java 与 JSF 一起使用,这是 Glassfish 3 容器。 在我的 Web 应用程序中,我试图实现一个文件(图像)管理系统。 我有一个 config.properties我从中读取上传
所以我一直在Processing工作几个星期以来,虽然我没有编程经验,但我已经转向更复杂的项目。我正在编写一个进化模拟器,它会产生具有随机属性的生物。 最终,我将添加复制,但现在这些生物只是在屏幕上漂
有人知道 Delphi 2009 对“with”的处理有什么不同吗? 我昨天解决了一个问题,只是将“with”解构为完整引用,如“with Datamodule、Dataset、MainForm”。
我是一名优秀的程序员,十分优秀!