Aracılığıyla paylaş


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 yeni bir oluşturma ConnectionMultiplexer işlemi sorunu düzeltir. Uygulamaların düzenli aralıklarla yeniden bağlanmaya zorlamasına izin verirken tekil ConnectionMultiplexer desen kullanmanızı öneririz. 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.

kullanıcıları ConnectionMultiplexer , eskisini devre dışı bırakmanın bir sonucu olarak oluşabilecek hataları işlemelidir ObjectDisposedException .

ve ForceReconnectAsync()için RedisConnectionExceptions çağrısında bulunurRedisSocketExceptions. ayrıca, ancak yalnızca cömert ForceReconnectAsync() ve kullanıyorsanız öğesini çağırabilirsiniz.RedisTimeoutExceptionsReconnectMinIntervalReconnectErrorThreshold 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. StackExchange.Redis'i doğrudan kullanmak yerine ASP.NET bir uygulamada Microsoft.Extensions.Caching.StackExchangeRedis kullanıyorsanız özelliğini true olarak ayarlayabilirsinizUseForceReconnect:

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ğlanma 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 , çok büyükse command timeout , komutunun zaman aşımına uyacağı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ı Tutamacı yeniden bağlamaya ConnectionMultiplexer izin vermenizi öneririz. Daha fazla bilgi için bkz . StackExchange.Redis en iyi yöntemleri.

Artık 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. Nasıl yaparım? uygulamamı dayanıklı hale getirme.

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 zaman aşımı, sunucunun bir istemci uygulaması tarafından yalnız bırakılmış sızdıran bağlantıları veya 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 düzenli aralıklarla veya heartbeat komutlar göndermeye keepalive 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.