让 Serverless 架构无处不在 何鹏,AWS 解决方案架构师 Harris He, Solutions Architect, Web Services 2018 年 1 月 9 日 9 th Jan, 2018
议程 : 1. Serverless 技术和 Lambda 简介 2. 场景一 : 无服务器的 Web 应用 3. 场景二 : 自动化运维 4. 场景三 :IoT 消息处理 5. 场景四 : 实时或批量处理大数据 6. 场景五 : 自动工作流
计算架构的演化 虚拟机 (Virtual Machine) 抽象了物理机, 看到的是多台虚拟的机器 需要配置管理存储 网络 操作系统等 EC2 数分钟启动, 运行数周乃至数月 容器 (Container) 抽象了操作系统, 看到的是多套应用环境 ECS 需要配置管理应用环境 数秒钟启动, 运行数小时乃至数天 无服务器 (Serverless) 抽象了运行时环境, 看到的是多个函数 Lambda 指定所需内存大小, 无需其他配置 随需启动, 运行数秒乃至数分钟
Serverless 服务越来越丰富 Compute Storage Database AWS Lambda S3 DynamoDB API Proxy Messaging and Queues Streaming API Gateway SQS SNS Kinesis Orchestration & State Management Monitoring & Debugging Many others AWS Step Functions AWS X-Ray
什么是 AWS Lambda? Serverless 打补丁 访问控制 容灾方案 选择机型 性能调优 能力规划 Code Only 全托管 高可用 可扩展负荷与性能监控 Node.js Python 配置管理 Java C# 自动扩展 镜像与备份
Lambda 事件驱动模式 非同步推送 非同步调用 从事件源调用 Lambda 函数 S3 SNS AWS Lambda 基于资源的权限管理 并发执行 同步推送 同步调用 AWS IoT Alexa AWS Lambda 抓取流式数据 同步调用 Lambda 函数主动去抓取 当有新数据时开始执行 DynamoDB Kinesis AWS Lambda 需要赋予 Lambda 相应的权限
使用 Lambda 的好处 无需维护天然高可用自动扩展按调用付费安全可靠
议程 : 1. Serverless 技术和 Lambda 简介 2. 场景一 : 无服务器的 Web 应用 3. 场景二 : 自动化运维 4. 场景三 :IoT 消息处理 5. 场景四 : 实时或批量处理大数据 6. 场景五 : 自动工作流
无服务器的 Web 应用 架构 CloudFront S3 PC API Dynamic content in Data stored in Mobile Gateway AWS Lambda DynamoDB
无服务器的 Web 应用 安全 Browser CloudFront OAI Geo-Restriction Signed Cookies Signed URLs DDOS S3 Bucket Policies ACLs AuthZ API Gateway Throttling Caching Usage Plans AWS Lambda DynamoDB IAM IAM
无服务器的 Web 应用 监控 Browser CloudFront Access Logs in S3 Bucket CloudWatch Metricshttps://aws.amazon.com/cl oudfront/reporting/ S3 Access Logs in S3 Bucket Custom CloudWatch Metrics & Alarms logs API Gateway Latency Count Cache Hit/Miss 4XX/5XX Errors AWS Lambda logs Invocations Invocation Errors Duration Throttled Invocations DynamoDB Latency Throughput Throttled Reqs Returned Bytes Streams
无服务器的 Web 应用 部署 AWS SAM (Serverless Application Model) AWS Lambda DynamoDB Serverless Template Package & Deploy S3 Serverless Template w/ CodeUri AWS CloudFormation API Gateway package deploy CI/CD Tools
议程 : 1. Serverless 技术和 Lambda 简介 2. 场景一 : 无服务器的 Web 应用 3. 场景二 : 自动化运维 4. 场景三 :IoT 消息处理 5. 场景四 : 实时或批量处理大数据 6. 场景五 : 自动工作流
我们依然需要运维 为什么还需要运维? 不是没有服务器了吗? 是的, 您不再需要维护服务器了! 但是, 您依然需要关心 : 我的应用程序是否健康运行? 是否有大量的 API 调用失败? 用户访问延时怎么样, 高吗? 数据库的读写性能是否正常?
为什么需要自动化? 更加敏捷 提高质量 增强稳定性 减少人为失误 降低人力和时间成本 更多创新
为什么需要 Lambda? 因为 Lambda 是事件驱动的, 对事件的响应近乎实时 AWS Lambda 事件 接近实时的响应
一个自动化运维的例子 当生产环境中的 EC2 被终止时发出通知 ~1 minute CloudTrail Lambda SNS CloudWatch Events Kinesis Data Streams EC2 事件规则 : StopInstances 事件目的地 Kinesis Data Firehose Elasticsearch 事件源 使用 ES+Kibana 进行检索
为什么要用 Kinesis Data Streams? CloudWatch Events 就可以直接触发 Lambda, 为什么中间还要加上 Kinesis Data Streams 呢? 实时性 : 收集 管理 分发实时数据流, 并对事件作出及时的响应 ; 是实时数据处理解决方案的核心服务之一 易用性 : 丰富的 API 接口 ; Kinesis 全托管的服务 Kinesis 家族包括 : Kinesis Data Streams: 持续收集和存储每小时 TB 级别的网站点击 系统日志 金融交易等数据 Kinesis Data Firehose: 将流式数据加载到 S3, RedShift, Elasticsearch 等存储服务中 Kinesis Data Analytics: 使用标准 SQL 语句对流式数据进行实时的查询 Kinesis Video Streams (NEW Launch!): 从设备端持续收集和存储视频流, 供媒体处理 机器学习 图像识别使用
为什么要用 Kinesis Data Streams? 考虑以下场景 : 场景 1: 不使用 Kinesis Data Streams Lambda 函数有 Bug, 怎么办? Kinesis 和 Lambda 经常结伴而行, 随后的场景里会讲到更多实现细节 CloudWatch Events Lambda 场景 2: 使用 Kinesis Data Streams 所有的事件都缓存下来了, 不怕丢! CloudWatch Events Kinesis Data Streams Lambda
议程 : 1. Serverless 技术和 Lambda 简介 2. 场景一 : 无服务器的 Web 应用 3. 场景二 : 自动化运维 4. 场景三 :IoT 消息处理 5. 场景四 : 实时或批量处理大数据 6. 场景五 : 自动工作流
IoT 消息处理 架构 Customer Application AWS Lambda 1 DynamoDB Device AWS IoT Custom CloudWatch Metrics & Alarms Kinesis Data Streams AWS Lambda 2 Machine Learning AWS Lambda 3 S3 EMR
处理同步呼叫 Customer Application AWS Lambda 1 DynamoDB Device AWS IoT
同步呼叫的案例
同步呼叫的案例
实时处理 IoT 消息 DynamoDB Device AWS IoT Custom CloudWatch Metrics & Alarms Kinesis Data Streams AWS Lambda 2
批处理 IoT 消息 Device AWS IoT Kinesis Data Streams Machine Learning AWS Lambda 3 S3 EMR
为什么要用 AWS IoT? 设备可以直接发消息给 Lambda 或者 Kinesis, 为什么还要使用 IoT 服务呢? AWS IoT 服务具有如下优势 : 安全 : 基于 TLS 的加密链接 基于 X.509 证书的双向认证 基于 IAM 的权限管理 ; AWS IoT 高可用 : 设备网关支持数亿设备 数十亿消息 ; 设备影子版本管理 缓存指令 ; 周边服务 : 与存储 大数据 机器学习等 AWS 服务天然集成, 挖掘数据价值
议程 : 1. Serverless 技术和 Lambda 简介 2. 场景一 : 无服务器的 Web 应用 3. 场景二 : 自动化运维 4. 场景三 :IoT 消息处理 5. 场景四 : 实时或批量处理大数据 6. 场景五 : 自动工作流
批量处理大数据
传统的本地解决方案 每 10 分钟定时执行 Map 作业 静态的 Hadoop 集群, 批处理交易文件 需要 24 * 5 的高可用 NAS Incoming Files FTP DB On premise data center
面临的挑战 缺乏弹性 按最大峰值配置 Hadoop 集群,50% 以上的时间都存在闲置资源 维护成本高 需要投入大量人力和时间, 对服务器 中间件和应用程序进行维护 数据可见性低 受限于批处理的时间间隔
Serverless 解决方案 所有数据都存储在 S3 上 合规性检查 Lambda 集群 消息队列负责缓存输入和输出的通知 控制节点 控制节点负责调用 Lambda 函数, 并接收 Lambda 函数的处理结果 SQS Lambda 函数负责执行合规性检查 消费者 S3 交易文件 FTP NAS 本地数据中心
带来的效果 Lambda 按使用付费, 节约了超过 50% 的成本 文件复制到 S3 后, 立即触发 Lambda 进行处理, 可在一分钟内看到检查结果, 提高了数据可见性 Lambda 天然可扩展, 不用担心计算能力不足 即使在交易量是平时 3 倍以上的大日子里, 也毫无压力 大量使用托管服务 (Lambda,SQS,S3,RDS), 基本上不需要管理基础设施
实时处理大数据 Device AWS IoT Kinesis Data Streams Lambda: Stream Processor S3 / DynamoDB: Intermediate Data S3 / DynamoDB: Final Output CloudWatch Events: Trigger every x minutes Lambda: Scheduled Dispatcher Lambda: Periodic Dump to S3 / DynamoDB
Kinesis 与 Lambda: 如何协同工作? Shard( 分片 ): 一个流由一个或多个分片组成 写入 :1K 记录 / 秒 / 片,1 MB/ 秒 / 片 读取 :5 次 / 秒 / 片,2 MB/ 秒 / 片 Lambda 并发模型 : 每个 Kinesis 分片对应一个 Lambda 例 :100 个分片, 就有 100 个 Lambda 在并发运行 当增加或减少分片数量的时候,Lambda 并发数量同时变化 流的总容量 = 分片 的容量 ( = 1 n) 根据输入数据速率的变化, 可以增加或减少分片数量
Kinesis 与 Lambda: 是否协同工作?
Kinesis 与 Lambda: 让他们协同工作 如果发现 Lambda 跟不上 Kinesis 的步伐, 我们可以 : 增加 Lambda 内存 优化 Lambda 程序 采用 Fan - out 模式 Device AWS IoT Kinesis Data Stream Lambda: Dispatcher Lambda: Processors Fan - out 模式 增加了吞吐量, 降低了延时, 但是, 破坏了时序性!
议程 : 1. Serverless 技术和 Lambda 简介 2. 场景一 : 无服务器的 Web 应用 3. 场景二 : 自动化运维 4. 场景三 :IoT 消息处理 5. 场景四 : 实时或批量处理大数据 6. 场景五 : 自动工作流
为什么需要自动化工作流? S3: Source Bucket Lambda: 第一步 : 剪裁第二步 : 压缩第三步 : 打水印第四步 : 归档 S3: Destination Bucket 用户上传图片 Triggered on PUTs 把所有任务都放到一个 Lambda 中完成, 真的合适吗? 如果中间某个任务失败了怎么办? 考虑 Lambda 的限制 : 例如, 最多只有五分钟的执行时间 无法享受微服务的诸多好处 : 组织 开发 部署 可用性 性能
大规模 Serverless 应用 λ λ λ λ λ λ λ λ λ λ λ λ Queue DBMS
服务之间多种交互方式 I want to sequence functions I want to run functions in parallel I want to select functions based on data I want to retry functions I want try/catch/finally I have code that runs for hours
AWS Step Functions
foodpanda 与 Step Functions AWS Step Functions, we can easily change and iterate on the application workflow of our food delivery service in order to optimize operations and continually improve delivery times. AWS Step Functions lets us dynamically scale the steps in our food delivery algorithm so we can manage spikes in customer orders and meet demand. Mathias Nitzsche, CTO, foodpanda
顺序处理的例子
并行处理的例子 "Send for OCR": { "Type": "Parallel", "Next": "Pick result", "Branches": [ { "StartAt": "Prep1", "States": { "Prep1": { "Type": "Pass", "Result": { "inputlist": [ "OCR Provider 1" ] }, "Next": "Go1" }, "Go1": { "Type": "Task", "Resource": "arn:aws:lambda:eu-central-1:123456789012:function:statesbot", "End": true } }
try / catch / finally 的例子 "Access Media": { "Type": "Task", "Resource": "arn:aws:lambda:eu-central-1:123456789012:function:findmedia "TimeoutSeconds": 2, "Next": "Graceful Exit", "Retry": [ { "ErrorEquals": [ "States.Timeout" ], "IntervalSeconds": 2, "MaxAttempts": 2, "BackoffRate": 1.5 } ], "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "Clean Up" } ] },
Thank You!