Jawaban:
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.)
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.
SQS
antrian dapat berlangganan ke SNS
topik dan untuk memproses SNS
pesan yang diterima . Saat ini, itu tidak dapat dilakukan ke arah lain tanpa pengkodean tambahan (lihat misalnya Lambda
FAQ ).
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 SQS
antrian diproses:
SQS
antrian dan kemudian memicu Lambda
pada acara SQSIni 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. = :)