Bài đăng trên blog này được viết bởi các Kiến trúc sư Giải pháp John Lee và Jeetendra Vaidya.
Hiện nay, AWS Lambda cung cấp một cách để điều khiển số lượng tối đa các hàm đồng thời được gọi bởi Amazon SQS như một event source. Bạn có thể sử dụng tính năng này để kiểm soát đồng thời hóa các hàm Lambda xử lý các tin nhắn trong các queue SQS riêng lẻ.
Bài viết này mô tả cách đặt giới hạn đồng thời tối đa của các trigger SQS khi sử dụng SQS như một event source với Lambda. Nó cũng cung cấp một tổng quan về hành vi tự mở rộng của Lambda sử dụng mô hình kiến trúc này, các thách thức mà tính năng này giúp giải quyết, và một bản demo về tính năng đồng thời tối đa.
Tổng quan
Lambda sử dụng một event source mapping để xử lý các mục từ một luồng hoặc queue. Event source mapping đọc từ một event source, chẳng hạn như một queue SQS, tùy chọn lọc các thông điệp, nhóm chúng và kích hoạt chức năng Lambda được ánh xạ.
Hành vi tỷ lệ cho tích hợp Lambda với queue SQS FIFO đơn giản. Một chức năng Lambda duy nhất xử lý các lô thông điệp trong một nhóm thông điệp duy nhất để đảm bảo các thông điệp được xử lý theo thứ tự.
Đối với các queue tiêu chuẩn SQS, event source mapping bỏ phiếu queue để tiêu thụ các thông điệp đến, bắt đầu với năm lô đồng thời với năm chức năng mỗi lần. Khi các thông điệp được thêm vào queue SQS, Lambda tiếp tục tỷ lệ để đáp ứng nhu cầu, thêm lên đến 60 chức năng mỗi phút, lên đến 1.000 chức năng, để tiêu thụ những thông điệp đó. Để biết thêm thông tin về hành vi tỷ lệ của Lambda, hãy đọc “Hiểu cách AWS Lambda tỷ lệ với các queue tiêu chuẩn Amazon SQS“.

Thách thức
Khi một lượng lớn các tin nhắn được đưa vào queue SQS, Lambda tự động mở rộng, thêm các chức năng bổ sung để xử lý các tin nhắn đó. Tuy nhiên, việc mở rộng này có thể tiêu thụ hết hạn ngạch đồng thời trong tài khoản. Để ngăn chặn điều này xảy ra, bạn có thể đặt hạn ngạch đồng thời dành riêng cho các chức năng Lambda riêng lẻ. Điều này đảm bảo rằng chức năng Lambda được chỉ định luôn có thể mở rộng đến mức đồng thời đó, nhưng cũng không thể vượt quá số này.
Khi đồng thời chức năng Lambda đạt đến giới hạn đồng thời dành riêng cho nó, cấu hình queue xác định hành vi tiếp theo. Tin nhắn được trả lại cho queue và thử lại dựa trên chính sách thử lại, hết hạn dựa trên chính sách giữ lại hoặc được gửi đến SQS dead-letter queue (DLQ). Trong khi việc gửi các tin nhắn chưa được xử lý đến DLQ là một tùy chọn tốt để bảo vệ các tin nhắn, điều này yêu cầu một cơ chế riêng để kiểm tra và xử lý các tin nhắn từ DLQ.
Ví dụ sau đây cho thấy một chức năng Lambda đạt đến giới hạn đồng thời dành riêng của nó là 10.

Tính năng mới “maximum concurrency” cho SQS như một event source
Tính năng mới “maximum concurrency” cho SQS như một event source cho phép bạn kiểm soát đồng thời của Lambda function trên mỗi nguồn. Bạn đặt giới hạn đồng thời tối đa trên bản đồ event source mapping, không phải trên Lambda function.
Cài đặt event source mapping này không thay đổi hành vi tự động mở rộng hoặc gom nhóm của Lambda với SQS. Bạn có thể tiếp tục gom nhóm các tin nhắn với kích thước và cửa sổ tùy chỉnh. Nó đặt giới hạn cho số lần gọi hàm đồng thời tối đa trên mỗi event source SQS. Khi Lambda mở rộng và đạt đến đồng thời tối đa được cấu hình trên event source, Lambda sẽ ngừng đọc thêm tin nhắn từ queue. Tính năng này cũng cung cấp cho bạn tính linh hoạt để xác định đồng thời tối đa cho các event source cá nhân khi Lambda function có nhiều event source.

Tính năng này có thể giúp tránh việc một hàm Lambda tiêu thụ toàn bộ khả năng tương đồng của tài khoản và tránh các thông điệp trở lại queue một cách không cần thiết do các hàm Lambda bị hạn chế. Nó cung cấp một cách dễ dàng để điều khiển và tiêu thụ các thông điệp ở tốc độ mong muốn, được điều khiển bởi số lượng hàm Lambda tương đồng tối đa.
Thiết lập tối đa tương đồng không thay thế tính năng tương đồng được đặt riêng. Cả hai tính năng này đều phục vụ mục đích khác nhau và có thể được sử dụng cùng nhau. Tối đa tương đồng có thể giúp tránh quá tải hệ thống phía dưới và các lần gọi bị hạn chế không cần thiết. Tương đồng được đặt riêng đảm bảo số lượng trường hợp tương đồng tối đa cho hàm.
Khi sử dụng cả hai tính năng cùng nhau, hàm Lambda có thể có khả năng được phân bổ riêng của nó (tương đồng được đặt riêng), trong khi vẫn có thể kiểm soát lưu lượng cho mỗi event source (tối đa tương đồng). Khi sử dụng hai tính năng cùng nhau, bạn phải đặt tương đồng được đặt riêng của hàm cao hơn tối đa tương đồng trên event source mapping SQS để tránh bị hạn chế.
Cấu hình đồng thời tối đa cho event source SQS
Bạn có thể cấu hình đồng thời tối đa cho event source SQS thông qua AWS Management Console, AWS Command Line Interface (CLI), hoặc các công cụ mã hóa cơ sở hạ tầng như AWS Serverless Application Model (AWS SAM). Giá trị tối thiểu được hỗ trợ là 2 và giá trị tối đa là 1000. Tham khảo tài liệu hạn mức Lambda để biết các giới hạn mới nhất.

Bạn có thể thiết lập tối đa đồng thời thông qua lệnh CLI create-event-source-mapping trong AWS.
Bash
aws lambda create-event-source-mapping –function-name my-function –ScalingConfig {MaxConcurrency=2} –event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue
Quan sát tính năng maximum concurrency trong action
Bài demo sau đây so sánh cách Lambda nhận và xử lý tin nhắn khác nhau khi sử dụng maximum concurrency so với reserved concurrency.
Repository GitHub này chứa một mẫu AWS SAM (Serverless Application Model) triển khai các tài nguyên sau:
- ReservedConcurrencyQueue (SQS queue)
- ReservedConcurrencyDeadLetterQueue (SQS queue)
- ReservedConcurrencyFunction (ambda function)
- MaxConcurrencyQueue (SQS queue)
- MaxConcurrencyDeadLetterQueue (SQS queue)
- MaxConcurrencyFunction (Lambda function)
- CloudWatchDashboard (CloudWatch dashboard)
Mẫu AWS SAM cung cấp hai kiến trúc tương tự nhau và một bảng điều khiển CloudWatch để giám sát các tài nguyên. Mỗi kiến trúc bao gồm một hàm Lambda nhận thông điệp từ queues SQS và một DLQ (Dead Letter Queue) cho queues SQS.
maxReceiveCount được thiết lập là 1 cho các queues SQS, điều này sẽ gửi bất kỳ thông điệp được trả lại trực tiếp đến DLQ. ReservedConcurrencyFunction có sự dụng reserved concurrency bằng 5, và MaxConcurrencyFunction có sử dụng maximum concurrency cho event source SQS được thiết lập là 5.
Yêu cầu tiên quyết
Để chạy demo này, bạn cần cài đặt CLI của AWS và AWS SAM CLI. Sau khi cài đặt cả hai CLI, bạn clone kho lưu trữ GitHub này và di chuyển đến thư mục gốc của nó:
Bash
git clone https://github.com/aws-samples/aws-lambda-amazon-sqs-max-concurrency
cd aws-lambda-amazon-sqs-max-concurrency
Triển khai AWS SAM template
- Sử dụng lệnh build để xây dựng AWS SAM template để chuẩn bị triển khai vào môi trường AWS của bạn.
Bash
sam build
sam build
- Sử dụng lệnh deploy để triển khai các tài nguyên vào tài khoản của bạn.
Bash
sam deploy –guided
- Đặt tên cho stack và chấp nhận các giá trị mặc định còn lại. Sau khi triển khai, bạn có thể theo dõi quá trình thông qua CLI hoặc bằng cách điều hướng đến trang AWS CloudFormation trong AWS Management Console.
- Lưu ý các queues URL từ tab Outputs trong AWS SAM CLI, bảng điều khiển CloudFormation hoặc truy cập console SQS để tìm các queues URL.

Chạy demo
Mã hàm Lambda đã triển khai mô phỏng quá trình xử lý bằng cách ngủ trong 10 giây trước khi trả về phản hồi 200. Điều này cho phép hàm đạt được một số lượng đồng thời cao với chỉ một số ít thông điệp.
Để thêm 25 thông điệp vào queues Reserved Concurrency, chạy các lệnh sau. Thay thế <ReservedConcurrencyQueueURL> bằng URL queues của bạn từ Outputs của AWS SAM.
Bash
for i in {1..25}; do aws sqs send-message –queue-url <ReservedConcurrencyQueueURL> –message-body testing; done
Để thêm 25 thông điệp vào queues Maximum Concurrency, chạy các lệnh sau. Thay thế <MaxConcurrencyQueueURL> bằng URL của queues của bạn từ Outputs của AWS SAM.
Bash
for i in {1..25}; do aws sqs send-message –queue-url <MaxConcurrencyQueueURL> –message-body testing; done
Sau khi gửi thông điệp đến cả hai queues, truy cập vào URL bảng điều khiển CloudWatch có sẵn trong tab Outputs để xem bảng điều khiển CloudWatch.
Xác minh kết quả
Cả hai hàm Lambda đều có số lần kích hoạt giống nhau và số kích hoạt đồng thời cố định là 5. Bảng điều khiển CloudWatch cho thấy ReservedConcurrencyFunction đã bị hạn chế và 9 thông điệp, như thấy trong chỉ số phía trên bên phải, đã được gửi đến DLQ tương ứng. MaxConcurrencyFunction không gặp bất kỳ sự hạn chế nào và các thông điệp không được chuyển đến DLQ.

Dọn dẹp
Để xóa tất cả các tài nguyên được tạo trong demo này, sử dụng lệnh xóa và làm theo các lời nhắc:
Bash
sam delete
Kết luận
Bây giờ bạn có thể kiểm soát số lượng tối đa các chức năng đồng thời được gọi bởi SQS như một event source của Lambda. Bài đăng này giải thích hành vi tự mở rộng của Lambda sử dụng mô hình kiến trúc này, thách thức mà tính năng này giúp giải quyết và một demo về tối đa đồng thời trong hành động.
Không có khoản phí bổ sung nào để sử dụng tính năng này ngoài các khoản phí SQS và Lambda tiêu chuẩn. Bạn có thể bắt đầu sử dụng tối đa đồng thời cho SQS như một event source với các ánh xạ event source mới hoặc hiện có bằng cách kết nối nó với SQS. Tính năng này có sẵn trong tất cả các khu vực thương mại nơi Lambda có sẵn.