Neden kuyrukta Redis?
Redis'in kuyruk sistemini uygulamak için iyi bir aday olabileceği izlenimini edindim. Bu noktaya kadar MySQL veritabanımızı sorgulama ya da RabbitMQ ile kullanıyorduk. RabbitMQ ile birçok sorun yaşadık - istemci kitaplıkları çok zayıf ve sorunlu ve bunları düzeltmek için çok fazla geliştirici saat harcamak istemiyoruz, sunucu yönetim konsolu ile birkaç sorun, vb. en azından, milisaniyeyi kavramıyoruz veya performansı ciddi şekilde zorluyoruz, bu nedenle bir sistem zekayı akıllıca destekleyen bir mimariye sahip olduğu sürece muhtemelen iyi durumdayız.
Tamam, öyleyse arka plan bu. Temel olarak çok klasik, basit bir kuyruk modelim var - iş üreten birkaç üretici ve iş yapan birkaç tüketici ve hem üreticilerin hem de tüketicilerin akıllıca ölçeklendirilmeleri gerekir. Bir saflığın PUBSUB
işe yaramadığı ortaya çıktı , çünkü tüm abonelerin iş tüketmesini istemiyorum, sadece bir abonenin işi almasını istiyorum . İlk geçişte bana BRPOPLPUSH
akıllı bir tasarım gibi geldi.
BRPOPLPUSH kullanabilir miyiz?
Temel tasarım BRPOPLPUSH
, bir iş sıranız ve bir ilerleme sıranız olması. Bir tüketici iş aldığında, ürünü atomik olarak ilerleme kuyruğuna doğru iter ve işi tamamladığında o LREM
olur. Bu, eğer müşteriler ölürse ve izlemeyi oldukça zahmetsiz hale getirirse, çalışmanın karartılmasını önler - örneğin, çok sayıda işin olup olmadığını söylemenin yanı sıra, tüketicilerin işleri yapmak için uzun zaman almalarına neden olan bir sorun olup olmadığını söyleyebiliriz.
Sağlar
- iş tam bir tüketiciye ulaştırılıyor
- iş, ilerleme kuyruğundaki rüzgârlara bürünür, bu nedenle tüketici olursa kara delik açamaz
Sakıncaları
PUBSUB
Redis'i sıraya sokmakla ilgili çoğu blog yazısının odaklandığı konu bu gibi görünüyor çünkü buldum en iyi tasarımın aslında kullanmıyor olması bana çok garip geliyor. Bu yüzden bariz bir şeyi kaçırdığımı hissediyorum.PUBSUB
Görevleri iki kere tüketmeden kullanmamın tek yolu , işin geldiğine dair bir bildirimde bulunmaktır; bu da tüketicilerin daha sonra engellemeyebilecekleri bir bildirimdirRPOPLPUSH
.- Bir seferde birden fazla iş öğesi istemek imkansız, bu bir performans sorunu gibi görünüyor. Durumumuz için çok büyük bir şey değil, ancak açıkça görülüyor ki bu operasyon yüksek verimlilik veya bu durum için tasarlanmadı
- Kısacası: Aptalca bir şey eksik mi?
Ayrıca node.js etiketini de ekliyorum çünkü en çok uğraştığım dil bu. Düğüm, tek iş parçacıklı ve bloksuz doğası göz önüne alındığında, uygulamada bazı basitleştirmeler sunabilir, ancak dahası, düğüm redis kitaplığını kullanıyorum ve çözümler de güçlü ve zayıf yönlerine karşı hassas olmalı veya hassas olmalıdır.