buraksenyurt / DistributedChallenge

Bu repoda aslında asenkron mesaj kuyruklarını hedef alan bir dağıtık sistem problemi oluşturmaya ve bu problemin çözümünü uygulamaya çalışıyorum.
111 stars 8 forks source link

Redis Stream'in Multiple Consumer Desteği Hk. #22

Open ismkdc opened 4 months ago

ismkdc commented 4 months ago

Selamlar, Redis stream'i consume ederken yükümüz arttıkça birden fazla consumer kullanmaya ihtiyacımız olabilir. Eğer hali hazırdaki RedisService üzerindeki Pop metodundan ilerlersek karşımıza bazı race condition problemleri çıkabilir. Pop metodu sırasıyla şöyle çalışıyor: 1-)Streamden mesajı oku, 2-)Mesajı streamden sil, 3-)Okuduğun mesajı return et.

Multi-thread bir dünyada, daha da önemlisi multi-instance bir dünyada, bu kullanım aynı anda birden fazla parçanın aynı mesajı okuyup işlemesine yol açabilir. Bu durum da sistemin kararlılığına zarar verebilir.

Bu problemi çözmek için redis stream'deki consumer group özelliğinden yararlanabiliriz. Consumer group özelliği, aynı consumer grubu paylaşan consumerların, bir mesajın aynı anda tek bir consumer'a iletileceğini garanti ediyor. Konu hk daha fazla bilgi: https://redis.io/docs/latest/develop/data-types/streams/#consumer-groups

Ayrıca, bu özelliği kullanan bir adet PoC geliştirdim onu da aşağıya bırakıyorum :) https://gist.github.com/ismkdc/1eef375d46995fa7a793a5584f2f3a89

buraksenyurt commented 4 months ago

İyi bir noktaya temas ettin @ismkdc Tekil bir solution üzerine çalışırken bu bahsettiğin Race Condition durumu fark edilmeyebilir de. Dolayısıyla mücadeye yeni bir cephe de açmak yerinde olabilir. Yük testine tabii tutmak ve bahsettiğin Race Condition durumunu tespit etmek ;-) Bunun üzerine de çalışalım. Grup kullanımı için de Dev branch üstünde geliştirmelere devam edilebilir. PR sonrası main'e merge ederiz ;) Çok teşekkürler desteğin için.