Chuyển đến nội dung chính

Time out của lamBDA Aws như thế nào?


Chắc hẳn nếu bạn đã từng làm qua AWS Lambda serverless thì thông số time out của lambda và các thành phần liên quan quả là nhứt đầu phải không ạ.

Bài viết này tập trung phân tích thông số time out của AWS Lambda.

Các thành phần thông thường khi thiết kế một hệ thống lambda serverless là:

Event source : có thể là : Api Gateway,

Lambda function: lambda

Service : có thể là S3, dynamoDb, DocumentDB, SNS, ....




Event source

AWS Api Gateway có thông số timeout tối đa là :29s 


Có nghĩa là khi một API được gọi vào thông qua AWS Api Gateway thì thời gian xử lý không quá 29s.
Nó phù hợp hầu hết các các API ngoaị trừ các API có một chút về tính toán

DynamoDB Stream có khả đọc 40 000 đơn vị trong một table cùng một lúc.



Lambda function

Thông số time out của lambda function có thể set lên tới 15 phút (900s )


Thông thường nó được set 5s. 

Concurrent Execution 

Có giá trị mặc định là 1 000 trên một aws account (authen thông qua 1 aws excute account).

Tức là nó có thể spin up lên 1000 containers cùng một lúc cho tất cả các service trên cùng một account.

Nếu conccurrrent không được handle ở function level thì nó sẽ ảnh hưởng tới throttling cho các service khác

Services

DynamoDB có khả năng đọc/ghi cùng một lúc lên tới 40000 đơn vị trên một table. 

S3: không giới hạn về object. 

Các dịch vụ của 3rd parties: phụ thuộc vào các luồng downstream.


Một số kịch bản time out chung chung của lamBDA 

Kịch bản 1: 

Một REST API thực thi lamBDA thông qua Api Gateway 

API này gọi tới dịch vụ bên thứ qua để lấy thông tin data. Nhưng một vài nguyên nhân bên thứ 3 không response. Nên lambda function bị time out 15 phút nên thread vẫn giữ wating for response trả về, 

Tuy nhiên threshold của Api Gateway là 29s nên dưới end-user sẽ nhận về time out error sau 29s. 

Giải pháp:

Giải pháp cho vấn đề này là set time out của lambda function thấp là 3 - 6s để chắc rằng function không cần phải đợi những request mà không có response trả về.

Kich bản 2:

REST API gọi nhiều service khác nhau, như gọi DynamoDB sau đó gôi API rồi gọi lại DynamoDB để cập nhật vào DynamoDB table.

Nếu API không response thì function sẽ đợi tới thời gian time out (giả sử là 6s ) sau thời gian time out thì REST API cũng time out 

Giải pháp: 

Cho mỗi điểm tích hợp thì phải set thời gian time out thích hợp để function có thể handle được thời gian time out một cách hiệu quả. 

Kịch bản 3:

Trong 2 kịch bản trên nếu ta set time out ngắn qúa thì request sẽ không thành công. 
Còn nếu set dài quá thì dẫn đến ứng dụng chạy chậm và tốn tài nguyên. 



Nhưng trong trường hơp trên thì set time out là 6s và cho mỗi integration là 2s. nhưng phần API call nó cần tới 3s để excute nên request dẫn tới bị lỗi. Mặc dù cả 1 tiến trình request là thấp hơn 6s. 




Trong trường hơp như hình trên ta set thời gian Time out quá dài 15s nhưng các đoạn integration chỉ cần 2s hoặc 3s để hoàn tất nên cũng sinh qua tình trạng time out của một request. 

Giải pháp:

Ta phải set time out phù hợp cho từng API call, từng integration và cho cả một tiến trình request. 

Ví dụ: 

Trong NodeJS set time out cho cả một function đang chạy: 

var server = app.listen();
server.setTimeout(6000);

Và set time out cho mỗi API call. 
app.post(‘/xxx’, function (req, res) {
  req.setTimeout( context.getRemainingTimeInMills() – 500 ); // 500ms to account recovery steps
});

context.getRemainingTimeInMills() là thời gian gần đúng còn lại của function đang thực thi.


Monitor lamBDA time out lỗi:


Dùng x-ray và cloudWatch để monitor lỗi time out. 

CloudWatch thì cho ta thấy được đồ hoạ như hình: 

str

Cloudwatch thì hiển thị những thông số monitor cơ bản. Để biết thêm về thời gian của downstream thì phải check x-ray: 


Bạn sẽ thấy rõ hơn thời gian s3 xử lý như thế nào, 

5 vấn để để có thiết lập lambda aws time out hớp lý hơn:

1. Luôn luôn set thời gian time out ngắn 3 - 6s sau đó ta chỉnh sửa time out ở batch size sau. 

2. Luôn bật tính năng x-ray và cloudwatch để dễ dàng debug và nhìn rõ hơn API call nó excute như thế nào. 

3. Nếu vấn đề time out không tránh khỏi thì ngoài error code, error description thì ta sử dụng fallback methods. 
 - Spring cloud cung cấp hystrix https://cloud.spring.io/spring-cloud-netflix/multi/multi__circuit_breaker_hystrix_clients.html
 - NodeJS cung cấp https://github.com/chilts/oibackoff

4. Set perfomance cho lambda: 
 - Tăng memory. 
 - Nếu function có quá nhiều integration trong đó thì nên break function đó ra nhiều những piece nhỏ hơn 

5. Dùng thư viện node-rate-limiter của node.js để control được số lượng invocation. 

6. Tăng node cho database hoặc xây thêm node trong cluster cho DB. 






Nhận xét

Bài đăng phổ biến từ blog này

Cách sử dụng sys.argv trong python.

Cách sử dụng sys.argv trong python.

sys.argv là môt danh sách [list] trong python, nó được sư dụng khi bạn chạy một lệnh command-line nào đó trên hệ thống.
Và argument này được đẩy vào script python để thực thi khi chạy câu lệnh.

Ví dụ: python sys.argv arg1 arg2

Trước tiên bạn phải import mô đun sys trong script.



import sys print"This is the name of the script: ", sys.argv[0]print"Number of arguments: ", len(sys.argv)print"The arguments are: ", str(sys.argv)

Tên của script này : sysargv.py
Số lượng arg là : 1
Arg là : ['sysargv.py']


python test1020.py 111 This is the name of the script:  test1020.py
Number of arguments:  2
The arguments are:  ['test1020.py', '111']

Thiết kế một RESTful API bằng python và flask.

Như các bạn đã biết thì REST viết tắt bởi REpresentational State Transfer. Bạn có thể tham khảo thêm ở đây.

Vậy REST là gì:

Có 6 yếu tố của REST như sau:

1. Client-Server: phía server side phục vụ như một service còn phía client sẽ dùng service này.

2.Stateless:  Mỗi request từ client phải chứa tất cả các thông tin mà phía server yêu cầu phải có. Nói nôm na là mỗi request chứa các thông tin riêng rẽ không liên quan đến những request khác.

3. Cacheable : Phía server side phải cảnh báo chỉ ra cho client side biết là request đó có cache hay không.

4. Hệ thống phân lớp: Giao tiếp giữa server side và client side có thể thông qua lớp trung gian ở giữa để trả lời các request được gọi mà không cân phía client phải làm những động tác khác nữa.

5. Các cổng giao tiếp là giống nhau : Các phương thức giao tiếp giữa client và server là khuôn mẫu giống nhau.

6. Mã code linh động. Phía server có thể thực thi cho môt API gọi duy nhất mà không ảnh hưởng tới các API khác.

RESTful web service là gì :

Kiế…

Cài đặt docker trên windows server 2016.

1. Cài đặt Windows Server 2016 Container Feature:  Mở PowerShell : Cài đặt các container feature dùng powershell: Dùng lệnh: InstallWindowsFeature containers Restart lại windows: 2. Cài đặt windows server 2016 base image:  Cài đặt mô đun : ContainerImage Dùng lệnh: Install-PackageProvider ContainerImage -force List các image có giá trị: Cài đặt Windows Server Core : 3. Cài đặt docker trên windows server 2016. Download script để cài đặt docker : Chạy script : Kiểm tra các image có trên server :