一、FaaS概述
FaaS(函数即服务)是Serverless的核心:
特点:
- 无状态
- 事件触发
- 自动扩缩容
- 按需付费
二、主流FaaS平台
1. 平台对比
| 平台 | 厂商 | 特点 |
|---|---|---|
| Lambda | AWS | 生态完善 |
| Function Compute | 阿里云 | 国内生态好 |
| Cloud Functions | 腾讯云 | 性价比高 |
| Cloud Functions | Kubernetes集成 |
2. 开发对比
// AWS Lambdaexports.handler=async(event)=>{return{statusCode:200,body:'Hello'};};// 阿里云FCmodule.exports.handler=async(req,resp)=>{resp.send('Hello');};// 腾讯云SCFexports.main=async(event,context)=>{return'Hello';};三、事件驱动架构
1. 事件源
事件源类型: ├── HTTP请求 ├── 对象存储(S3/OSS) ├── 消息队列 ├── 数据库变更 ├── 定时任务 ├── 监控系统告警 └── CDN事件2. 事件处理
// S3事件处理(AWS Lambda)exports.handler=async(event)=>{for(constrecordofevent.Records){constbucket=record.s3.bucket.name;constkey=record.s3.object.key;awaitprocessFile(bucket,key);}};// 消息队列处理exports.handler=async(event)=>{constmessages=JSON.parse(event.Records[0].body);for(constmsgofmessages){awaitprocessMessage(msg);}};四、函数编排
1. AWS Step Functions
{"Comment":"订单处理流程","StartAt":"验证订单","States":{"验证订单":{"Type":"Task","Resource":"arn:aws:lambda:region:account:function:validateOrder","Next":"库存检查"},"库存检查":{"Type":"Task","Resource":"arn:aws:lambda:region:account:function:checkInventory","Next":"创建订单"},"创建订单":{"Type":"Task","Resource":"arn:aws:lambda:region:account:function:createOrder","End":true}}}2. 阿里云流程编排
-name:order-flowtype:flowprops:region:cn-hangzhoudefinition:|start: type: pass next: validate validate: type: task resource: acs:fc:cn-hangzhou:srv:validate-order next: process process: type: task resource: acs:fc:cn-hangzhou:srv:process-order next: notify notify: type: task resource: acs:fc:cn-hangzhou:srv:send-notification next: end end: type: pass五、最佳实践
1. 函数设计原则
// 单一职责exports.handler=async(event)=>{returnawaitprocessEvent(event);};// 无状态设计exports.handler=async(event)=>{constuserId=event.userId;constuser=awaitdb.getUser(userId);returnuser;};// 错误处理exports.handler=async(event)=>{try{returnawaitprocess(event);}catch(error){console.error('Error:',error);thrownewError('Process failed');}};2. 日志追踪
exports.handler=async(event,context)=>{constrequestId=context.requestId;logger.info('Function started',{requestId});try{constresult=awaitprocess(event);logger.info('Function completed',{requestId});returnresult;}catch(error){logger.error('Function failed',{requestId,error});throwerror;}};六、应用场景
1. 文件处理
// 图片处理exports.handler=async(event)=>{consts3Event=event.Records[0].s3;constbucket=s3Event.bucket.name;constkey=decodeURIComponent(s3Event.object.key);constimage=awaits3.getObject({Bucket:bucket,Key:key}).promise();constresized=awaitsharp(image.Body).resize(800).toBuffer();awaits3.putObject({Bucket:bucket,Key:`resized/${key}`,Body:resized}).promise();};2. 实时数据处理
// 日志分析exports.handler=async(event)=>{constlogs=event.records.map(r=>JSON.parse(r.data));conststats=logs.reduce((acc,log)=>{acc[log.level]=(acc[log.level]||0)+1;returnacc;},{});awaitmetrics.putMetricData({MetricData:Object.entries(stats).map(([level,count])=>({MetricName:`LogLevel.${level}`,Value:count}))}).promise();};3. webhook处理
// GitHub Webhookexports.handler=async(event)=>{constpayload=JSON.parse(event.body);switch(event.headers['x-github-event']){case'push':awaithandlePush(payload);break;case'pull_request':awaithandlePullRequest(payload);break;case'issues':awaithandleIssue(payload);break;}return{statusCode:200};};七、总结
FaaS与事件驱动:
- 函数:最小执行单元
- 事件:触发函数执行
- 编排:组合复杂流程
- 场景:文件处理、实时计算、webhook
个人观点,仅供参考