Mengapa Redis harus antri?
Saya mendapat kesan bahwa Redis dapat menjadi kandidat yang baik untuk menerapkan sistem antrian. Hingga saat ini kami telah menggunakan database MySQL kami dengan polling, atau RabbitMQ. Dengan RabbitMQ kami memiliki banyak masalah - perpustakaan klien sangat buruk dan bermasalah dan kami ingin tidak menginvestasikan terlalu banyak waktu pengembang untuk memperbaikinya, beberapa masalah dengan konsol manajemen server, dll. Dan, untuk saat ini setidaknya, kita tidak memahami selama milidetik atau secara serius mendorong kinerja, jadi selama suatu sistem memiliki arsitektur yang mendukung antrian dengan cerdas, kita mungkin dalam kondisi yang baik.
Oke, jadi itu latar belakangnya. Pada dasarnya saya memiliki model antrian yang sangat klasik dan sederhana - beberapa produsen yang menghasilkan pekerjaan dan beberapa konsumen yang mengkonsumsi pekerjaan, dan baik produsen maupun konsumen harus dapat meningkatkan skala secara cerdas. Ternyata naif PUBSUB
tidak berfungsi, karena saya tidak ingin semua pelanggan mengkonsumsi pekerjaan, saya hanya ingin satu pelanggan menerima pekerjaan. Pada awalnya, sepertinya bagiku BRPOPLPUSH
adalah desain yang cerdas.
Bisakah kita menggunakan BRPOPLPUSH?
Desain dasar dengan BRPOPLPUSH
Anda memiliki satu antrian kerja dan antrian kemajuan. Ketika seorang konsumen menerima pekerjaan itu secara atomis mendorong item ke dalam antrian kemajuan, dan ketika itu menyelesaikan pekerjaan itu LREM
dia. Ini mencegah blackholing pekerjaan jika klien mati dan membuat pemantauan cukup mudah - misalnya kita dapat mengetahui apakah ada masalah yang menyebabkan konsumen membutuhkan waktu lama untuk melakukan tugas, di samping memberi tahu jika ada banyak tugas.
Itu memastikan
- pekerjaan dikirim ke tepat satu konsumen
- pekerjaan berakhir dalam antrian kemajuan, sehingga tidak dapat blackhole jika konsumen
Kekurangannya
- Tampaknya agak aneh bagi saya bahwa desain terbaik yang saya temukan tidak benar-benar digunakan
PUBSUB
karena ini tampaknya menjadi tujuan kebanyakan posting blog tentang antrian atas fokus Redis. Jadi saya merasa seperti kehilangan sesuatu yang jelas. Satu-satunya cara saya melihat untuk digunakanPUBSUB
tanpa menghabiskan tugas dua kali adalah dengan hanya mendorong pemberitahuan bahwa pekerjaan telah tiba, yang kemudian dapat dilakukan konsumen tanpa pemblokiranRPOPLPUSH
. - Tidak mungkin untuk meminta lebih dari satu item pekerjaan pada satu waktu, yang tampaknya menjadi masalah kinerja. Bukan yang besar untuk situasi kita, tetapi lebih jelas mengatakan operasi ini tidak dirancang untuk throughput tinggi atau situasi ini
- Singkatnya: apakah saya kehilangan sesuatu yang bodoh?
Juga menambahkan tag node.js, karena itulah bahasa yang paling saya hadapi. Node dapat menawarkan beberapa penyederhanaan dalam implementasi, mengingat sifatnya single-threaded dan nonblocking, tetapi lebih lanjut saya menggunakan perpustakaan node-redis dan solusi harus atau bisa peka terhadap kekuatan dan kelemahannya juga.