<

Redis'i Sadece Önbellek Sanmayın: Kuyruk, Kilit ve Oturum Kullanımları

Redis'i projeye "önbellek lazım" diyerek ekleriz. Bir süre sonra aynı Redis örneği oturumları, kuyrukları ve kilitleri de taşımaya başlar. Bu kötü bir şey değil; Redis bunun için uygun. Ama her kullanımın kendine ait riskleri var ve önbellek gibi "kaybolsa da olur" mantığıyla yönetildiğinde canlıda can yakıyor.

Kuyruk: Laravel'de en doğal ikinci kullanım

Laravel'de QUEUE_CONNECTION=redis ayarı e-posta, bildirim, rapor üretimi gibi ağır işleri istek döngüsünün dışına taşır. Veritabanı kuyruğuna göre gecikmesi düşüktür ve çok sayıda işçi süreci rahatça çalışır. Laravel Horizon ile kuyruk uzunluğu ve başarısız işler izlenebilir.

Dikkat edilecek nokta dayanıklılık. Redis varsayılan ayarlarda verisini bellekte tutar; sunucu yeniden başlarsa kuyruktaki işler kaybolabilir. Ödeme sonrası fatura kesmek gibi kaybedilemeyecek işler için AOF kalıcılığını (appendonly yes) açın veya işi veritabanında da bir kayıtla izleyin. Ayrıca işleri tekrar çalışabilir (idempotent) yazın: aynı iş iki kez çalışırsa müşteriye iki fatura gitmemeli.

Kilit: aynı işi iki kez yapmamak

Zamanlanmış bir görev iki sunucuda birden çalıştığında ya da bir kullanıcı düğmeye iki kez bastığında yarış durumu oluşur. Laravel'in Cache::lock('rapor-uretimi', 30) yapısı Redis üzerinde atomik bir kilit alır. Kilit alınamazsa ya beklenir ya da iş atlanır. Temel kural, her kilidin bir süre sonu olması; süresiz kilit, çöken bir süreçten sonra sistemin kilitlenmesi demektir.

  • Kilit süresini işin en uzun makul süresinden biraz uzun seçin.
  • Kilidi yalnızca sahibinin bırakabildiğinden emin olun; Laravel bunu owner belirteciyle yapar.
  • Birden çok bağımsız Redis düğümüne yayılan "dağıtık kilit" ihtiyacınız varsa tek örnekli kilidin garantilerini ayrıca değerlendirin.
  • Kritik para hareketlerinde nihai doğruluğu kilide değil, veritabanı kısıtlarına (benzersiz indeks, işlem) dayandırın.

Oturum: hızlı ama paylaşılan bir bağımlılık

Birden fazla uygulama sunucusunun arkasında dosya tabanlı oturum çalışmaz; her sunucu kendi dosyasını görür. SESSION_DRIVER=redis bu sorunu çözer ve oturum okumayı hızlandırır. Bedeli, Redis'in artık girişin de bağımlılığı olması: Redis düşerse kullanıcılar oturumunu kaybeder. Oturum süresini SESSION_LIFETIME ile bilinçli belirleyin ve Redis yeniden başladığında herkesin çıkış yapmasının kabul edilebilir olup olmadığını önceden düşünün.

Hepsini tek örnekte toplamayın

Önbellek, kuyruk, kilit ve oturum aynı Redis örneğinde yaşarsa bir tanesinin sorunu hepsini etkiler. Önbellek dolup bellek sınırına gelince maxmemory-policy eski anahtarları silmeye başlar; allkeys-lru politikasıyla kuyruktaki iş de silinebilir. Çözüm ayrı veritabanı numarası değil, mümkünse ayrı örnek ya da en azından ayrı politika. Önbelleği "silinebilir", kuyruğu ve oturumu "silinemez" olarak sınıflayıp ayırmak, canlıda çok işe yarıyor.

İzleme tarafında da üç gösterge yeter: bellek kullanımı, bağlı istemci sayısı ve kuyruk uzunluğu. Bellek tavana yaklaşıyorsa ya da kuyruk büyüyor ama işçiler boşta duruyorsa sorunu kullanıcı fark etmeden yakalarsınız.

Sık yapılan hatalar

Sahada en çok gördüğümüz üç hata şunlar: kuyruk işlerinde retry_after süresini işin süresinden kısa bırakmak (iş bitmeden ikinci kez başlar), kilidi finally bloğunda bırakmayı unutmak ve önbellek anahtarlarına ortam öneki koymadığı için test ile canlı ortamın aynı Redis'i paylaşması. Üçü de ilk günlerde belli olmaz, yük arttığında ortaya çıkar. Hepsi de küçük bir yapılandırma disipliniyle önlenebilir. Son olarak, Redis'i hiç tanımadığınız bir ortamda canlıya almadan önce bir yük denemesi yapın: kuyruğu bilerek şişirin, belleği doldurun, Redis'i yeniden başlatın ve uygulamanın bunlara nasıl tepki verdiğini izleyin. Bu üç deneme, dokümantasyonun anlatmadığı davranışları gösterir ve olası kesintinin gece yarısı değil, planlı bir test sırasında yaşanmasını sağlar.

Redis'i projenizde önbellek dışında da kullanıyorsanız ve mimarisini sağlamlaştırmak isterseniz iletişim sayfamızdan bize ulaşın. Laravel backend projelerinde edindiğimiz saha tecrübesini, kuyruk ve oturum tasarımınızı canlıya çıkmadan gözden geçirmek için seve seve paylaşırız.

📅 Yayınlanma:  ·  Yakup Zengin