AWS SQS + SNS + Lambda


11

Tôi đã tự hỏi nếu tôi có thể gửi tin nhắn đến hàng đợi SQS và đăng ký một chủ đề SNS đến nó để kích hoạt lambda để gửi email.

SQS -> SNS -> (Lambda) -> SES

Tôi biết tin nhắn SNS có thể được gửi tới SQS nhưng tôi tò mò liệu có cách nào khác không?

Câu trả lời:


11

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.)


Tôi đang suy nghĩ về việc làm chính xác điều này. Bạn có biết nếu bạn bị tính phí mỗi lần Cloudwatch kiểm tra hàng đợi của bạn không? Không phải là chúng ta thực sự đang nói nhiều tiền với loại điều này chỉ gây tò mò hơn.
Brian F Leighty

Ngoài ra, tôi đang giả sử từ những gì bạn nói báo thức liên tục gửi SNS của báo thức? Bạn có thời gian chờ nào trên chức năng lambda của bạn được đặt thành?
Brian F Leighty

Một thứ khác. Xin lỗi cho tất cả các ý kiến. Tôi đã có một chút lo lắng với phần "Xấp xỉ" bạn đã bao giờ có một tin nhắn đang chờ ở đó mà không được xử lý vì nó nghĩ rằng chỉ có 0 mục thay vì 1 mục ở đó?
Brian F Leighty

@BrianFLeighty kiểm tra là miễn phí. Nhưng nó không báo động liên tục; nó có thể yêu cầu một báo động thứ hai cho các tin nhắn ngồi trên hàng đợi (được thêm vào giữa hoàn thành thực hiện lambda và báo động tiếp theo). Bỏ phiếu có thể là một giải pháp tốt hơn; Của tôi hoạt động cho một hàng đợi rất yên tĩnh (do đó không có giá trị bỏ phiếu.)
mực ống

Bỏ lỡ bình luận "gần đúng". Điều đó có vẻ hoạt động tốt, nhưng ymmv
squidpickles

7

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 đó.


3
Cũng không có gì sai khi sử dụng các thủ thuật xếp hàng truyền thống với lambda: ví dụ: nếu lambda xử lý một thông điệp, trong khi thực hiện, sau đó truy xuất lại chức năng ở cuối; mặt khác, hãy để nó thực thi tiếp theo như dự kiến
nik.shornikov

1

SQShàng đợi có thể được đăng ký vào SNSchủ đề và do đó để xử lý SNStin 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ụ: LambdaCâ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 SQSxử lý hàng đợi:

  1. bạn có thể thực hiện các nguồn sự kiện của riêng bạn
  2. bạn có thể có một số phiên bản EC2 trung gian để nghe SQShàng đợi và sau đó kích hoạt Lambdacác sự kiện SQS

0

Đ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. = :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.