Câu trả lời:
Một điều tôi đã làm là tạo báo thức CloudWatch trên ApproximateNumberOfMessagesVisible
( >= 1 for 5 minutes
) cho hàng đợi SQS. Báo thức xuất bản cho một chủ đề SNS kích hoạt chức năng lambda. Hàm lambda lặp cho đến khi xóa hàng đợi.
Có thể mất tới 5 phút để kích hoạt từ báo thức, nhưng nó hoạt động tuyệt vời cho các tác vụ theo lịch trình hàng loạt mà không cần phải thăm dò hàng đợi. (Độ chi tiết báo động là 5 phút cho hàng đợi hoạt động.)
Bạn không thể đi SQS -> SNS
, chỉ SNS -> SQS
.
Lambda hiện hỗ trợ lập lịch trình, do đó, một tùy chọn là triển khai trình đẩy của SQS trong chức năng Lambda và chạy nó thường xuyên.
Một lựa chọn khác để xem xét là bạn có thực sự cần một hàng đợi hay không. Lambda hỗ trợ xử lý không đồng bộ (thông qua chế độ gọi Sự kiện) và nên chia tỷ lệ theo chiều ngang để xử lý các yêu cầu song song. Nếu chức năng lambda của bạn không yêu cầu quyền truy cập vào một cửa hàng nhà nước trung tâm có thể hạn chế thực thi song song thì có lẽ bạn chỉ có thể chạy song song tất cả các yêu cầu của mình. Tôi tin rằng có giới hạn thực hiện đồng thời 100 cho mỗi tài khoản, vì vậy bạn có thể cần phải bó các tin nhắn của mình để duy trì điều đó.
SQS
hàng đợi có thể được đăng ký vào SNS
chủ đề và do đó để xử lý SNS
tin nhắn nhận được . Hiện tại, không thể thực hiện theo hướng khác nếu không có mã hóa bổ sung (xem ví dụ: Lambda
Câu hỏi thường gặp ).
Tôi muốn nói có một vài lựa chọn làm thế nào để làm điều đó nhưng nó không thanh lịch bằng việc sử dụng hệ thống hướng sự kiện phổ biến hơn AWS event->SQS->Lambda
. Nếu không, bạn có thể cần tùy chỉnh / triển khai mã cách SQS
xử lý hàng đợi:
SQS
hàng đợi và sau đó kích hoạt Lambda
các sự kiện SQSĐiều này đã được hỏi và trả lời một lúc trước, nhưng chỉ cần nghĩ về điều này bản thân mình, tôi nghĩ tôi sẽ thêm một cách tiếp cận.
Như đã đề cập, Nguồn sự kiện có thể là đặt cược tốt nhất ở đây. Ngoài ra, và tôi đã không kiểm tra điều này cũng như không nghĩ đến điều này (vì vậy đây là loại học thuật), nhưng có thể thực hiện điều này thông qua mô hình Fan-Out với SNS như sau:
1. Create a SNS topic.............................: SNS-topic-01
2. Subscribe a SQS queue to that topic............: SQS-queue-01
3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01
Sử dụng cấu hình này, việc gửi tin nhắn đến chủ đề SNS sẽ đưa nó vào hàng đợi SQS đồng thời kích hoạt chức năng Lambda đồng hành. Hàm Lambda đó sẽ được viết để đọc chính hàng đợi SQS đó nhưng với tính năng Bỏ phiếu dài (tối đa 20 giây) để nó không đọc hàng đợi trước khi hoàn thành nhiệm vụ (nghĩa là điều kiện cuộc đua).
Về bản chất, lược đồ này chỉ kịp thời gọi một hàm Lambda cho mỗi thông báo SQS đã được xử lý. Tôi không biết các trình đọc Long Poll đồng thời hoạt động như thế nào trên SQS (... có ai bị bỏ không?), Nhưng đây chỉ là một cách khác để xem xét giải quyết vấn đề này. = :)