Apa praktik terbaik untuk memindahkan pesan dari antrian surat mati kembali ke antrian asli di Amazon SQS?
Apakah itu
- Dapatkan pesan dari DLQ
- Tulis pesan ke antrian
- Hapus pesan dari DLQ
Atau ada cara yang lebih sederhana?
Selain itu, apakah AWS pada akhirnya akan memiliki alat di konsol untuk memindahkan pesan dari DLQ?
amazon-web-services
amazon-sqs
Matt Dell
sumber
sumber
Jawaban:
Ini hack cepat. Ini jelas bukan pilihan terbaik atau direkomendasikan.
sumber
Ada beberapa skrip di luar sana yang melakukan ini untuk Anda:
sumber
npx replay-aws-dlq DL_URI MAIN_URI
Tidak perlu memindahkan pesan karena akan datang dengan begitu banyak tantangan lain seperti pesan duplikat, skenario pemulihan, pesan hilang, pemeriksaan de-duplikasi, dll.
Inilah solusi yang kami terapkan -
Biasanya, kami menggunakan DLQ untuk kesalahan sementara, bukan untuk kesalahan permanen. Jadi ambil pendekatan di bawah ini -
Baca pesan dari DLQ seperti antrian biasa
ManfaatKemudian ikuti kode yang sama yang mengikuti antrian biasa.
Lebih andal jika pekerjaan dibatalkan atau proses dihentikan saat memproses (mis. Instance dimatikan atau proses dihentikan)
ManfaatPerluas visibilitas pesan sehingga tidak ada thread lain yang memprosesnya.
ManfaatHapus pesan hanya jika ada kesalahan permanen atau berhasil.
Manfaatsumber
Sepertinya itu pilihan terbaik Anda. Ada kemungkinan bahwa proses Anda gagal setelah langkah 2. Dalam hal ini Anda akan menyalin pesan dua kali, tetapi aplikasi Anda harus menangani pengiriman ulang pesan (atau tidak peduli).
sumber
sini:
sumber
Ada cara lain untuk mencapai ini tanpa menulis satu baris kode pun. Pertimbangkan nama antrian Anda yang sebenarnya adalah SQS_Queue dan DLQ untuk itu adalah SQS_DLQ. Sekarang ikuti langkah-langkah ini:
sumber
aws sqs receive-message --queue-url <url of DLQ> --max-number-of-messages 10
. Karena pesan maksimal Anda dapat membaca huruf besar pada 10, saya sarankan untuk menjalankan perintah dalam lingkaran seperti ini:for i in {1..1000}; do <CMD>; done
Saya menulis skrip python kecil untuk melakukan ini, dengan menggunakan boto3 lib:
Anda bisa mendapatkan skrip ini di sini tautan
skrip ini pada dasarnya dapat memindahkan pesan antar antrian sembarang. dan mendukung antrian fifo serta Anda dapat menyediakan
message_group_id
lapangan.sumber
Kami menggunakan skrip berikut untuk memindahkan pesan dari antrian src ke antrian tgt:
nama file:
redrive.py
pemakaian:
python redrive.py -s {source queue name} -t {target queue name}
sumber
DLQ mulai berlaku hanya jika konsumen asli gagal menggunakan pesan dengan sukses setelah berbagai upaya. Kami tidak ingin menghapus pesan karena kami yakin kami masih dapat melakukan sesuatu dengannya (mungkin mencoba memproses lagi atau mencatatnya atau mengumpulkan beberapa statistik) dan kami tidak ingin terus menemukan pesan ini berulang kali dan menghentikan kemampuan untuk memproses pesan lain di balik pesan ini.
DLQ tidak lain hanyalah antrian lain. Yang berarti kita perlu menulis konsumen untuk DLQ yang idealnya berjalan lebih jarang (dibandingkan dengan antrian asli) yang akan mengkonsumsi dari DLQ dan menghasilkan pesan kembali ke antrian asli dan menghapusnya dari DLQ - jika itu perilaku yang diinginkan dan menurut kami konsumen asli sekarang siap untuk memprosesnya lagi. Seharusnya tidak masalah jika siklus ini berlanjut untuk sementara waktu karena sekarang kami juga mendapatkan kesempatan untuk memeriksa secara manual dan membuat perubahan yang diperlukan dan menerapkan versi lain dari konsumen asli tanpa kehilangan pesan (tentu saja dalam periode retensi pesan - yaitu 4 hari sebelum default).
Alangkah baiknya jika AWS menyediakan kemampuan ini di luar kotak tetapi saya belum melihatnya - mereka menyerahkan ini kepada pengguna akhir untuk menggunakannya dengan cara yang mereka rasa sesuai.
sumber