Azure Yönetilen Redis ile bağlantı dayanıklılığı

Bu makalede, önbelleğinize nasıl dayanıklı bağlantılar yapacağınızı anlatacağız.

Yeniden deneme komutları

üstel geri alma ile komutları yeniden denemek için istemci bağlantılarınızı yapılandırın. Daha fazla bilgi için bkz . Yeniden deneme yönergeleri.

Linux tarafından barındırılan istemci uygulamaları için TCP ayarları

Bazı Linux sürümlerindeki varsayılan TCP ayarları, Redis sunucu bağlantılarının 13 dakika veya daha fazla süreyle başarısız olmasına neden olabilir. Varsayılan ayarlar, istemci uygulamasının kapalı bağlantıları algılamasını ve bağlantı düzgün bir şekilde kapatılamadıysa bunları otomatik olarak geri yüklemesini engelleyebilir.

Bağlantının yeniden kurulamaması, ağ bağlantısının kesintiye uğraması veya Redis sunucusunun plansız bakım için çevrimdışı olması durumunda oluşabilir.

Şu TCP ayarlarını öneririz:

Ayarlar Değer
net.ipv4.tcp_retries2 5

Senaryo hakkında daha fazla bilgi için bkz. Linux üzerinde çalışırken 15 dakika boyunca bağlantı yeniden kurulmuyor. Bu tartışma StackExchange.Redis kitaplığıyla ilgili olsa da, Linux üzerinde çalışan diğer istemci kitaplıkları da etkilenir. Açıklama hala yararlıdır ve diğer kitaplıklara genelleştirebilirsiniz.

ForceReconnect ile StackExchange.Redis kullanma

Nadir durumlarda StackExchange.Redis, bağlantı bırakıldıktan sonra yeniden bağlanamıyor. Bu gibi durumlarda istemciyi yeniden başlatmak veya ConnectionMultiplexer yeni bir oluşturmak sorunu düzeltir. Önerimiz, uygulamaların belirli aralıklarla yeniden bağlantı kurmasına izin vererek Singleton ConnectionMultiplexer deseni kullanmanızdır. Uygulamanızın kullandığı çerçeveye ve platforma en uygun hızlı başlangıç örnek projesine göz atın. Bu kod deseninin bir örneğini hızlı başlangıçlarımızda görebilirsiniz.

ConnectionMultiplexer kullanıcıları, eski ObjectDisposedException hâline getirmek sonucu oluşabilecek hataları işlemelidir.

ForceReconnectAsync() için çağrı yapın ve RedisConnectionExceptions ve RedisSocketExceptions'yi arayın. Ayrıca, yalnızca cömert ReconnectMinInterval ve ReconnectErrorThreshold kullanıyorsanız, ForceReconnectAsync() öğesini RedisTimeoutExceptions için çağırabilirsiniz. Aksi takdirde, yeni bağlantılar kurmak, zaten aşırı yüklenmiş olduğundan zaman aşımına uğramaya devam eden bir sunucuda art arda hataya neden olabilir.

ASP.NET bir uygulamada, StackExchange.Redis paketini doğrudan kullanmak yerine Microsoft.Extensions.Caching.StackExchangeRedis paketinde tümleşik uygulamayı kullanabilirsiniz. ASP.NET uygulamanızda doğrudan StackExchange.Redis yerine Microsoft.Extensions.Caching.StackExchangeRedis kullanıyorsanız, UseForceReconnect özelliğini true olarak ayarlayabilirsiniz.

Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect = true

Uygun zaman aşımlarını yapılandırma

Bağlantı dayanıklılığında dikkate alınması gereken iki zaman aşımı değeri vardır: bağlanma zaman aşımı ve komut zaman aşımı.

Bağlantı zaman aşımı

connect timeout, istemcinizin Redis sunucusuyla bağlantı kurmak için beklediği zamandır. İstemci kitaplığınızı beş saniye kullanacak connect timeout şekilde yapılandırarak sisteme daha yüksek CPU koşullarında bile bağlanmak için yeterli süre tanıyın.

Küçük connection timeout bir değer, bu zaman diliminde bağlantı kurulmasını garanti etmez. Bir sorun oluşursa (yüksek istemci CPU'su, yüksek sunucu CPU'sunu vb.) kısa connection timeout bir değer bağlantı girişiminin başarısız olmasına neden olur. Bu davranış genellikle kötü bir durumu daha kötü hale getirir. Daha kısa zaman aşımları yardımcı olmak yerine, sistemi yeniden bağlanmaya çalışma işlemini yeniden başlatmaya zorlayarak sorunu daha da kötüleştirebilir ve bu da bir bağlantı -> başarısız -> yeniden deneme döngüsüne neden olabilir.

Komut zaman aşımı

Çoğu istemci kitaplığı için command timeoutsbaşka bir zaman aşımı yapılandırması vardır. Bu, istemcinin Redis sunucusundan yanıt bekleme zamanıdır. Beş saniyeden kısa bir başlangıç ayarı önersek de, senaryonuza command timeout ve önbelleğinizde depolanan değerlerin boyutlarına bağlı olarak daha yüksek veya daha düşük bir ayar yapmayı göz önünde bulundurun.

command timeout çok küçükse, bağlantı kararsız görünebilir. Ancak, eğer command timeout çok büyükse, komutun zaman aşımına uğrayıp uğramayacağını öğrenmek için uygulamanızın uzun süre beklemesi gerekebilir.

İstemci bağlantısında ani artışlardan kaçınma

Yeni bağlantı oluşturma işlemleri hız sınırına sahip olduğundan, bağlantı kaybından sonra yeniden bağlanırken aynı anda birçok bağlantı oluşturmaktan kaçının. Kısa bağlantı zaman aşımlarının daha uzun kesintilere neden olabileceğine benzer şekilde, aynı anda birçok yeniden bağlantı girişimi başlatmak da sunucu yükünü artırabilir ve tüm istemcilerin başarıyla yeniden bağlanması için gereken süreyi uzatabilir.

Birçok istemci örneğini yeniden bağlanıyorsanız, yeni bağlantılarınızın kısıtlanmasını önlemek için yeni bağlantıları kademelendirmeyi göz önünde bulundurun.

Uyarı

StackExchange.Redis istemci kitaplığını kullandığınızda, bağlantı dizesinde abortConnect değerini false olarak ayarlayın. Bağlantıyı yeniden kurmasını ConnectionMultiplexer kontrol etmesine izin vermenizi tavsiye ederiz. Daha fazla bilgi için bkz. StackExchange.Redis en iyi yöntemleri.

Gereksiz bağlantılardan kaçının

Önbellekler, önbellek katmanı başına istemci bağlantısı sayısıyla ilgili sınırlara sahiptir. İstemci uygulamanız bağlantıları yeniden oluştururken kapandığından ve eski bağlantıları kaldırdığından emin olun.

Dayanıklılık için daha fazla tasarım deseni

Dayanıklılık için tasarım desenleri uygulayın. Daha fazla bilgi için bkz Uygulamamı nasıl dayanıklı hale getiririm.

Boş durma zaman aşımı

Azure Yönetilen Redis'in boşta bağlantılar için 10 dakikalık zaman aşımı vardır. 10 dakikalık süre aşımı, sunucunun bir istemci uygulaması tarafından terk edilmiş ya da sızıntı yapan bağlantıları otomatik olarak temizlemesine olanak tanır. Redis istemci kitaplıklarının çoğu, istemci uygulamasından herhangi bir istek olmasa bile bağlantıların kapatılmasını önlemek için heartbeat veya keepalive komutlarını periyodik olarak göndermeye yönelik yerleşik bir özelliğe sahiptir.

Bağlantılarınızın 10 dakika boşta kalma riski varsa, aralığı 10 dakikadan kısa bir değerle yapılandırın keepalive . Uygulamanız işlevsellik için keepalive yerel desteğe sahip olmayan bir istemci kitaplığı kullanıyorsa, düzenli aralıklarla bir PING komut göndererek bunu uygulamanızda uygulayabilirsiniz.