繼續學習 re:Invent 2016 的 Serverless 系列課程. 這一堂內容主要是講Serverless架構中,有關於資料層這方面的一些重點提示.
Data tier options on AWS
選項
後端資料層的選項大概有這幾種, 依適合的場合來選擇.
- DynamoDB
- ElastiCache
- RDS
- Redshift
DynamoDB use cases
NoSQL 與 SQL 各有擅場, 這邊舉了一些DynamoDB適合的場景
- 線上廣告: Ad serving, ID lookup ..
- IoT: Tracking state, metadata and readings from millions of devices ..
- Gaming: 排行榜, session information..
- Mobile & Web: Storing user profiles, session details, settings ..
AWS Lambda with DynamoDB
- Lambda 不需要放在 VPC,可直接連
- 使用 DynamoDB 儲存持久性資料, 配合 ElastiCache 加強讀取的效能
AWS Lambda with RDS
- Lambda function 預設是能直通 internet 的
- Lambda function 放到 VPC 會喪失 internet 連線能力.但是你可以看狀況決定要不要放到VPC.
- 假如你的 Lambda function 同時需要連線 internet & VPC , 可在private subnet 使用NAT instance 或 NAT gateway 串接起來.
- 將 Lambda 放在VPC ,需要存取 RDS/EC2..等資源時,需要設定:
- 修改 Lambda 設定中的 VPC Subnet ID & Security group
- 新增一個 IAM Role, 有現成的Policy叫做 AWSLambdaVPCAccessExecutionRole 可掛上去
- Security Group inbound要設定好
- 放在VPC後, 得確定你的 subnet 夠大,有足夠的IP
- Lambda function 盡量避免對public hostname 做 DNS 解析. 可節省一點點時間.
- 大規模使用的話 ,RDS instance type大小很重要. 假如是使用DynamoDB/ElastiCache 就不怕 high concurrency的狀況.
- Kinesis sandwich架構: 如果需要控制流量大小,可使用此架構 ( Lambda -> Kinesis -> Lambda -> Storage tier )
- 善用 Lambda function 的 hot start 機制。 程式裡面 handler 以外的 scope (例如全域變數) 有機會在下次 invoke起來後重複使用. 所以適合用像是 DB Connection 這類適合重複使用的物件.
AWS Lambda with ElastiCache
- 在VPC內部存取
- Memcache 適合大量Read的場景
- Redis 適合大量write的場景
- 使用 Redis 寫入時, 可使用 Redis pipeline (有點像批次寫入) 減少一些網路開銷.
結尾
Language Runtimes
- function & lib 的大小會影響啟動速度, 程式最好注意減肥一下.
- 大一點的 Lambda function 記憶體大小會減少一些延遲,有十幾種大小選項可以選, 調整效能時或許都測測看?
Local Caching
- 重申一次,在程式裡面, handler 以外的 scope (例如全域變數) 有機會在下次 invoke起來後重複使用,要善用它.
- Lambda function 提供的檔案暫存目錄 /tmp (512MB)裡的檔案,下次 invoke起來時也有可能繼續存在!
- 可使用 schedule 每分鐘都跑一下Lambda function 保持一個持續熱機的狀態.
Retries and Event Ordering
- API Gateway 呼叫 Lambda function : 同步, 假如 Lambda 程式有問題,就結束,不會重試.
- S3/SNS 呼叫 Lambda function : 非同步 , 有3次 retry 機制, 還有最近發表的 Dead Letter Queue機制.