为设计师配置一台电脑时,内存(RAM)是非常关键的组件之一,因为它直接影响到多任务处理能力和运行大型设计软件的流畅性。
前几篇文章讲了设计师电脑配置的三大件中的两件:CPU、显卡
具体大家可以回顾下:
2024室内设计师推荐使用配置系列-台式机-CPU
2024室内设计师推荐使用配置系列-台式机-显卡
今天这篇文章会讲到三大件的最后一个:内存
下面是一些关于选择内存的具体建议:
1. 内存容量
建议32GB的内存。
构通过自动管理底层计算资源,允许开发者将精力集中于核心业务逻辑上。这种模型中,开发者仅需上传业务逻辑代码,由 Serverless 平台负责运行和自动扩展资源。
函数计算(Function as a Service, FaaS)是 Serverless 架构中的一个核心组件,它允许开发者上传代码片段,并在特定事件触发时自动执行这些代码。此外,事件总线作为一种 Serverless 事件服务,能够处理和路由来自多个源的事件,这个过程避免了在应用程序中直接编写复杂的监听和轮询逻辑,使系统更加(易于)模块化和可扩展。
在正式进入主题前,我们先简要回顾下传统架构处理用户上传图片的基本流程。下图展示了传统微服务架构下实现图片处理的流程:
在 Serverless 架构中,图片处理变得简单和自动化。以下是一个简单的 Serverless 图片处理流程:
通过上述流程综合比较,Serverless 架构在成本、扩展性和维护上提供了显著优势,尤其适合需求变化大、用户无法预测流量的应用场景。而传统的服务基础架构可能更适用于流量相对稳定,对环境控制要求较高的场合。
本文后续将以对图片的压缩并加水印为例,详细介绍如何在 Serverless 架构中,利用事件总线和函数计算,轻松搭建一个自动化的图像处理服务。
图像处理步骤
图像处理服务的完整处理流程如下:
- 部署函数(步骤1):开发者在函数计算平台部署函数用于处理图像,本示例是配置图片压缩以及添加水印服务
- 配置规则(步骤4):开发者在事件总线上配置事件处理规则,定义何种类型的事件应该被监听和处理
- 开启通知(步骤7):开发者在 OBS 平台界面打开 xxx Bucket 的事件通知开关
- 上传图片(步骤10):用户将待处理的图片上传至 OBS 相应的开启了事件通知的 xxx Bucket
- 事件通知(步骤11):OBS 检测到图片上传后,向事件总线发送事件通知
- 触发规则(步骤12):事件总线根据预设的事件规则过滤事件,确定是否应该将事件传递给函数计算上的对应服务
- 函数处理(步骤14):函数接收到事件消息后,根据事件的内容对图片进行处理
- 存储图片(步骤15):函数将处理完成的图片上传回 OBS 的指定 Bucket(需要注意区分源 Bucket 和目标 Bucket,避免事件动作成环)
针对图像处理服务,我们可以将服务的整个部署过程分为四步,分别为部署函数、配置事件规则、开启通知、上传图片测试
步骤1: 配置函数计算
函数计算上的服务会接收从事件总线发来的事件消息,并执行预定义的图像处理任务,这里我们要实现的是图像的压缩以及添加水印。
编写代码
使用函数计算支持的编程语言编写函数,指定如何处理图像。下面以 go 语言为例:
图片下载
...
bucket = record.S3.Bucket.Name
region = record.AwsRegion
fileName := record.S3.Object.Key
inPath := fileName
fileNameAll := path.Base(fileName)
fileSuffix := path.Ext(fileName)
filePrefix := fileNameAll[0 : len(fileNameAll)-len(fileSuffix)]
outPath := filePrefix + dstFileSuffix
s3Client := utils.NewClientByParam(bucket, ak, sk, region, endpoint)
err := s3Client.DownloadFile(nil, fileName, inPath)
if err != nil {
return nil, cloudevents.NewHTTPResult(http.StatusNotFound, "s3 download failed")
}
...
图像压缩
...
// Open a image.
src, err := imaging.Open(inPath)
if err != nil {
return err
}
// Resize srcImage to width = 800px preserving the aspect ratio.
dstImage800 := imaging.Resize(src, 800, 0, imaging.Lanczos)
// Save the resulting image as JPEG.
err = imaging.Save(dstImage800, outPath)
if err != nil {
return err
}
...
图像加水印
...
//原始图界限
origin_size := origin.Bounds()
//创建新图层
canvas := image.NewNRGBA(origin_size)
// 贴原始图
draw.Draw(canvas, origin_size, origin, image.ZP, draw.Src)
// 贴水印图
draw.Draw(canvas, watermark.Bounds().Add(image.Pt(30, 30)), watermark, image.ZP, draw.Over)
//生成新图片
create_image, _ := os.Create(outPath)
jpeg.Encode(create_image, canvas, &jpeg.Options{95})
defer create_image.Close()
...
完整版代码,请点击:代码下载。
部署函数
首先通过 智汇云产品页面 进入函数计算控制台,进入路径如下图:产品 -> Serverless开发 -> 函数计算FC
将处理图像的服务部署到函数计算,在函数计算控制台选择 创建函数->使用自定义运行时创建->本地zip包上传,因为是本地编译打包,创建函数的时候,选择对应的云端构建方式为无需云端构建, 运行环境选择 Go 1.20.* 即可
函数部署完成后我们需要拿到函数触发器的 Endpoint,以便我们后续配置事件总线 API 目标 使用
步骤2: 配置事件规则
当图片上传到 OBS,对应的事件通知会发送到事件总线,为了将具体的事件转发到对应的函数服务,就需要配置事件规则来监听这些上传事件
设置事件规则
同样地,我们通过 智汇云产品页面 进入事件总线控制台,进入路径如下图:产品 -> Serverless开发 -> 事件总线 EventBridge
在事件总线的 default总线下新建事件规则,指定当图片上传到 OBS 时触发函数。这里我们设置的规则是匹配来自 OBS 并且 Bucket 名称为 event-bucket 的所有对象的创建事件
配置事件目标
首先我们需要创建一个以函数计算为事件目标的 API 目标,请求方式选择 POST, 连接方式选择与函数计算服务对应的鉴权方式。(注:目前事件总线函数目标、函数计算事件触发器正在测试中,近期即将上线新功能,将极大简化事件函数目标的配置,敬请期待~)
将函数目标与事件规则进行关联,以便自动执行图像处理。我们这里通过 API 目标的方式将函数计算的函数服务与事件总线关联起来。这里我们选择已经创建好的 function_image_resize API 目标
步骤3: 开启通知
在上传图片测试之前,我们还需要手动将 OBS 平台的 “事件通知” 开关打开,设定完成之后该 Bucket 下面所有事件都将被发送到事件总线
步骤4: 上传图片测试
我们将图片上传到 OBS 上一个特定的桶(示例配置的是: event-bucket)中。这可以通过多种方式实现,包括使用 OBS 控制台、SDK、API 等 。
我们这里以使用 OBS 控制台为例:
图片上传完成后文件列表如图:
图片上传成功以后,从列表中可以看到文件大小为 3M 多。这个时候,我们可以查看函数计算应用的函数/请求日志,观察图片的实时处理情况:
观察到日志成功后,我们会在 OBS 控制台的 xxx Bucket 下看到同一层级目录下面多了一个名称后缀为 _output 的图片,并且大小已经改变。(注意:建议上传图片的 Bucket 和接收处理完成图片的 Bucket 设置成不同的,避免事件成环)
图片处理前,大小 3.3M:
图片处理后,大小变成 226K, 并且已经加上了水印图片:
至此,我们利用 Serverless 架构,通过事件总线以及函数计算,轻松完成了上传图片的异步压缩以及添加水印的功能。
总结
我们可以看到,通过 Serverless 架构可以解决很多传统生产中遇到的问题,并且可以以更少的资源对常见问题进行新策略的定制。Serverless 架构提供了一种高效、节约成本和资源的方式来处理图像等复杂数据任务。结合事件总线和函数计算,使得从概念到产品的实现过程大为简化,减少了企业的技术负担,同时也显著提高了处理效率和系统可扩展性。它不仅能帮助企业降低运营成本,还能提高业务响应速度和市场适应性。
随着技术的发展,Serverless 正在成为处理高动态负载和大规模多媒体内容的首选方法。无论是技术人员寻求优化现有解决方案,还是非技术人员希望简化操作,Serverless 都提供了极大的便利和价值。
如果您对函数计算和事件总线产品感兴趣,欢迎联系我们(私信&留言都可以)。