AWS SQS + SNS + Lambda

11

Saya bertanya-tanya apakah saya dapat mengirim pesan ke antrian SQS dan berlangganan topik SNS untuk memicu lambda untuk mengirim email.

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

Saya tahu pesan SNS dapat dikirim ke SQS tapi saya ingin tahu apakah sebaliknya mungkin

Chida
sumber

Jawaban:

11

Satu hal yang saya lakukan adalah membuat alarm CloudWatch on ApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) untuk antrian SQS. Alarm menerbitkan ke topik SNS yang memicu fungsi lambda. Fungsi lambda loop sampai membersihkan antrian.

Diperlukan waktu hingga 5 menit untuk memicu dari alarm, tetapi bekerja secara fantastis untuk tugas-tugas yang dijadwalkan berjadwal tanpa perlu melakukan polling antrian. (Granularity alarm adalah 5 menit untuk antrian aktif.)

squidpickles
sumber
Saya sedang berpikir untuk melakukan hal yang persis sama ini. Apakah Anda tahu jika Anda ditagih setiap kali cloudwatch memeriksa antrian Anda? Bukan berarti kita benar-benar berbicara banyak dengan hal semacam ini hanya lebih ingin tahu.
Brian F Leighty
Juga, saya berasumsi dari apa yang Anda katakan alarm terus mengirim SNS alarm berulang-ulang? Anda mengatur batas waktu fungsi lambda Anda?
Brian F Leighty
Satu hal lagi. Maaf untuk semua komentar. Saya sedikit khawatir dengan bagian "Perkiraan" apakah Anda pernah memiliki waktu di mana ada pesan menunggu di sana yang tidak ditangani karena mengira hanya ada 0 item, bukan 1 item di sana?
Brian F Leighty
@BrianFLeighty cek gratis. Tapi itu tidak alarm terus menerus; mungkin memerlukan alarm kedua untuk pesan yang duduk di antrian (ditambahkan antara penyelesaian eksekusi lambda dan alarm berikutnya). Polling mungkin merupakan solusi yang lebih baik; Tambang bekerja untuk antrian yang biasanya sangat sepi (karenanya tidak layak polling.)
squidpickles
Tidak ada komentar "perkiraan". Tampaknya bekerja dengan baik, tetapi ymmv
squidpickles
7

Anda tidak bisa pergi SQS -> SNS, hanya saja SNS -> SQS.

Lambda sekarang mendukung penjadwalan sehingga salah satu opsi adalah untuk mengimplementasikan poller SQS dalam fungsi Lambda dan menjalankannya sering.

Pilihan lain untuk dipertimbangkan adalah apakah Anda benar-benar membutuhkan antrian. Lambda mendukung pemrosesan tidak sinkron (melalui mode doa acara) dan harus secara transparan skala secara horizontal untuk menangani doa paralel. Jika fungsi lambda Anda tidak memerlukan akses ke toko pusat negara yang mungkin membatasi eksekusi paralel maka Anda mungkin bisa menjalankan semua permintaan Anda secara paralel. Saya percaya ada 100 batas eksekusi bersamaan per akun, jadi Anda mungkin perlu mengelompokkan pesan Anda agar tetap di bawah itu.

thexacre
sumber
3
juga tidak ada yang salah dengan menggunakan trik antrian poller tradisional dengan lambda: misalnya jika lambda membagikan pesan, selama eksekusi, maka retrigger fungsi di akhir; jika tidak biarkan dieksekusi berikutnya sesuai jadwal
nik.shornikov
1

SQSantrian dapat berlangganan ke SNStopik dan untuk memproses SNSpesan yang diterima . Saat ini, itu tidak dapat dilakukan ke arah lain tanpa pengkodean tambahan (lihat misalnya LambdaFAQ ).

Saya akan mengatakan ada beberapa opsi bagaimana melakukannya tetapi tidak begitu elegan seperti menggunakan sistem yang lebih umum yang didorong oleh peristiwa AWS event->SQS->Lambda. Kalau tidak, Anda mungkin perlu menyesuaikan / mengimplementasikan kode bagaimana SQSantrian diproses:

  1. Anda dapat mengimplementasikan sumber acara Anda sendiri
  2. Anda dapat memiliki beberapa instance EC2 menengah untuk mendengarkan SQSantrian dan kemudian memicu Lambdapada acara SQS
dsmsk80
sumber
0

Ini ditanyakan dan dijawab beberapa waktu lalu, tetapi setelah memikirkan hal ini sendiri, saya pikir saya akan menambahkan pendekatan.

Seperti disebutkan, Sumber Acara mungkin merupakan taruhan terbaik di sini. Atau, dan saya belum menguji ini atau memikirkan ini secara menyeluruh (jadi ini semacam akademis), tetapi mungkin untuk mencapai ini melalui pola Fan-Out dengan SNS sebagai berikut:

 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

Dengan menggunakan konfigurasi ini, mengirimkan pesan ke topik SNS akan membawanya ke antrian SQS sambil secara bersamaan memicu fungsi Lambda pendamping. Fungsi Lambda itu akan ditulis untuk membaca antrian SQS yang sama tetapi dengan Polling Panjang diaktifkan (hingga 20 detik) sehingga tidak membaca antrian sebelum enqueue selesai (yaitu kondisi balapan).

Intinya, skema just-in-time ini memanggil satu fungsi Lambda untuk setiap pesan SQS enqueued. Saya tidak tahu bagaimana simultan pembaca Long Poll bekerja pada SQS (... apakah ada yang turun?), Tapi ini hanyalah cara lain untuk mempertimbangkan pemecahan ini. = :)

NYCeyes
sumber