Hal-hal Yang Tidak Diketahui Tentang SQS
Dalam hal antrian, layanan AWS SQS adalah pilihan yang bagus. Ini sangat murah, sangat andal, dan dapat diperluas lebih dari yang kita butuhkan.
Secara umum, saya penggemar layanan yang tidak harus saya kelola sendiri. Sebagian besar layanan terkelola di AWS cukup mahal. SQS adalah salah satu dari sedikit layanan yang sangat nyaman yang sangat terjangkau.
Namun, ada beberapa perbedaan penting yang perlu Anda ketahui. Setiap detail berikut telah menggigit saya sebelumnya. Berikut adalah beberapa detail SQS yang harus Anda ketahui:
Batas Waktu Visibilitas
Salah satu bagian unik dari antrian SQS adalah batas waktu visibilitas, Sebagian besar dari kita mungkin terbiasa untuk tidak memikirkan hal ini-ketika kita mendapatkan pekerjaan dengan pekerja isyarat Laravel, pekerja isyarat lainnya tidak mengambil pekerjaan itu.
SQS bekerja sedikit berbeda. Katakanlah batas waktu visibilitas diatur ke 10 detik. Jika pekerja antrian membutuhkan waktu lebih dari 10 detik untuk memproses pekerjaan, SQS menampilkan ulang pekerjaan tersebut. Ini berarti bahwa pekerja antrian lain dapat mengambil pekerjaan itu.
Oleh karena itu, perlu diperhatikan bahwa batas waktu visibilitas diatur lebih tinggi daripada waktu yang diperlukan untuk menyelesaikan pekerjaan, Batas Waktu Visibilitas dapat diatur ke nilai default untuk setiap antrian SQS atau untuk setiap pekerjaan individu. Anda juga dapat memperpanjang batas waktu visibilitas untuk pekerjaan yang sudah ada.
Laravel tidak menetapkan batas waktu visibilitas, jadi Anda disarankan untuk menetapkan nilai default yang lebih tinggi dari nilai yang diperlukan untuk memproses pekerjaan.
Namun, ada "peretasan" yang dapat digunakan untuk memperpanjang batas waktu visibilitas pekerjaan. Anda selalu dapat mengatur penundaan dan memanggil metode release().
Untuk driver antrian SQS, ini menetapkan batas waktu visibilitas. Jika Anda memiliki pekerjaan tertentu yang mungkin memakan waktu lebih lama dari batas waktu visibilitas default, panggil metode ini di awal pekerjaan (tertunda !!) untuk meningkatkan batas waktu visibilitas. Saya bisa. Ini meningkatkan waktu pemrosesan pekerjaan sebelum dapat diambil oleh pekerja antrian lain.
public function handle() {
// Increase visibility timeout for this job
// to one minute
$this->release(60);
// Continue on with the job...
}
Jika Anda tidak menyetel penundaan, Batas Waktu Visibilitas akan menjadi nol dan pekerjaan akan segera muncul di antrean SQS.
long dan short poling
Semua API SQS berbasis HTTP. Ini berarti bahwa ketika antrian pekerja polling SQS untuk pekerjaan baru, mengirimkan permintaan HTTP ke SQS API. Secara default, ini melakukan "jajak pendapat singkat". Jika tidak ada pekerjaan yang tersedia saat permintaan HTTP dibuat, SQS akan segera mengembalikan respons kosong.
Jajak pendapat panjang memungkinkan Anda untuk menjaga permintaan HTTP tetap terbuka untuk jangka waktu tertentu. SQS dapat mengirim pekerjaan ke pekerja antrian kapan saja saat permintaan HTTP terbuka.
Laravel tidak melakukan polling yang panjang, tetapi ada sesuatu yang penting untuk diketahui di sini. Dengan driver antrian SQS, beberapa pekerjaan dapat memakan waktu lama untuk diproses, seolah-olah pekerja antrian tidak dapat menemukan pekerjaan baru. Ini terkait dengan bagaimana SQS diskalakan dalam AWS.
Berikut adalah beberapa hal relevan yang harus Anda ketahui dari dokumentasi SQS:
Dengan polling singkat, permintaan ReceiveMessage hanya menanyakan sebagian dari server (berdasarkan distribusi acak berbobot) untuk menemukan pesan yang dapat disertakan dalam respons. Jika kueri tidak menemukan pesan, Amazon SQS akan segera mengirimkan tanggapan kepada Anda.
Dengan polling yang panjang, permintaan ReceiveMessage menanyakan semua server untuk pesan tersebut. Amazon SQS mengumpulkan setidaknya satu pesan yang tersedia dan kemudian mengirimkan respons, hingga jumlah pesan maksimum yang ditentukan dalam permintaan. Amazon SQS mengirimkan respons kosong hanya ketika waktu tunggu polling telah berlalu.
Jajak pendapat yang lebih panjang mensurvei semua server SQS yang mungkin berisi pekerjaan, sehingga kemungkinan besar Anda mendapatkan pekerjaan lebih cepat. Namun, Laravel tidak mendukung polling panjang mentah. Untungnya, kita bisa melakukan sesuatu untuk itu. Ada catatan kecil di bagian bawah dokumen yang ditautkan di atas.
Polling singkat terjadi ketika parameter WaitTimeSeconds dari permintaan ReceiveMessage diatur ke 0 dengan salah satu dari dua cara berikut:
- Panggilan ReceiveMessage menyetel WaitTimeSeconds ke 0.
- Panggilan ReceiveMessage tidak mengatur WaitTimeSeconds, tetapi atribut antrian ReceiveMessageWaitTimeSeconds diatur ke 0.
Ini adalah hal kecil, tetapi tentu saja membantu mengatasi gangguan antrian SQS sesekali.
Garansi dan pesanan pekerjaan
SQS memiliki dua rasa:- standar
- FIFO (masuk pertama, keluar pertama)
SQS standar
SQS standar adalah apa yang kebanyakan dari kita gunakan. Ini menjamin "setidaknya satu pengiriman" dan tidak ada yang lain. Ini berarti dua hal:
Tidak ada deduplikasi. Jika Anda mengirim pekerjaan yang sama persis ke SQS beberapa kali, itu akan diproses beberapa kali. Ini mungkin bukan kejutan. Mengirim pekerjaan yang sama persis ke antrian Laravel menyebabkan pekerjaan selesai diproses beberapa kali.
Tidak ada jaminan urutan pesan-bahkan jika Anda hanya menggunakan pekerja antrian tunggal, pekerjaan tidak akan selalu diproses dalam urutan yang sama Anda mengirim mereka.
Ini berbeda dengan driver antrian Laravel lainnya seperti driver Database dan driver Redis.Ingatlah bahwa SQS standar mencoba mengirimkan pekerjaan sesuai urutan penerimaannya, tetapi ini tidak selalu memungkinkan karena ukuran dan arsitektur SQS. Ini dapat ditemukan di FAQ SQS di sini.
FIFO SQS
Antrian FIFO memiliki dua jaminan:- Tepat satu proses
- Urutan pesan
Antrian FIFO menghapus pekerjaan duplikat. Anda dapat mengizinkan SQS untuk menentukan apakah pekerjaan diduplikasi berdasarkan data pekerjaan, atau Anda dapat mengatur ID deduplikasi ke nilai pilihan Anda. SQS menggunakan nilai tersebut untuk membandingkan dengan pekerjaan lain. Jika pekerjaan dengan konten atau ID deduplikasi yang sama ditemukan, pekerjaan duplikat akan dihapus.
Oleh karena itu, ini membantu mencegah pekerjaan yang sama diproses beberapa kali. FIFO juga menjamin urutan pesan. Antrian FIFO mengirimkan pekerjaan sesuai urutan pengirimannya (pertama masuk, pekerjaan / pesan terlama keluar pertama yang diproses terlebih dahulu).
Pekerjaan yang akan diproses tidak akan dikirim sampai pekerjaan tersebut tidak selesai (dihapus). Namun, ini berarti memiliki banyak pekerja antrian tidak berguna. Jadi, apakah Anda ingin menskalakan antrean FIFO untuk memproses banyak pekerjaan sekaligus?
Anda dapat menggunakan grup pesan. Pemesanan dijamin hanya dalam grup pesan, sehingga Anda bisa mendapatkan konkurensi dalam antrian FIFO dengan menetapkan grup pesan unik ke pekerjaan yang perlu diproses secara berurutan.
Misalnya, aplikasi Anda dapat menetapkan grup pesan untuk setiap pengguna. Dalam hal ini, ID grup pesan ditetapkan sebagai "pengguna-x". x adalah ID pengguna.
Ada beberapa lagi dalam antrian FIFO. Lihat artikel tentang menggunakan antrian FIFO untuk informasi lebih lanjut tentang mereka.