Aracılığıyla paylaş


Bağlantı dayanıklılığı

Önemli

Redis için Azure Cache, tüm SKU'lar için kullanımdan kaldırma zaman çizelgesini duyurdu. Mevcut Redis için Azure Cache örneklerinizi en kısa sürede Azure Yönetilen Redis'e taşımanızı öneririz.

Kullanımdan kaldırma hakkında daha fazla bilgi için:

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.

Dayanıklılığı test edin

Bir düzeltme eki uygulamasını simüle ederek yeniden başlatarak sisteminizin bağlantı kopmalarına karşı dayanıklılığını test edin. Performansınızı test etme hakkında daha fazla bilgi için bkz. Performans testi.

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:

Setting 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.

StackExchange.Redis ile ForceReconnect'i kullanarak

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 ConnectionMultiplexer oluşturmak sorunu düzeltir. Uygulamaların belirli aralıklarla yeniden bağlanmaya zorlanmasına izin verirken bir singleton ConnectionMultiplexer deseni 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ın ConnectionMultiplexer, eskisini elden çıkarmanın bir sonucu olarak oluşabilecek ObjectDisposedException hatalarını işlemeleri gerekir.

ForceReconnectAsync() için RedisConnectionExceptions ve RedisSocketExceptions arayın. Sadece cömert ForceReconnectAsync() ve RedisTimeoutExceptions kullanıyorsanız ReconnectMinInterval'yi ReconnectErrorThreshold 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. StackExchange.Redis'i doğrudan kullanmak yerine ASP.NET bir uygulamada Microsoft.Extensions.Caching.StackExchangeRedis kullanıyorsanız özelliğini true olarak ayarlayabilirsiniz:UseForceReconnect

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 zamanlayıcı süresi doldu

Ç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, 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ındaki ani artışları önleme

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ırken, bağlı istemci sayısındaki ani bir artıştan kaçınmak için yeni bağlantıları kademeli hale getirmeyi göz önünde bulundurun.

Uyarı

StackExchange.Redis istemci kitaplığını kullandığınızda, bağlantı dizenizde abortConnectfalse olarak ayarlayın. Yeniden bağlantıyı ConnectionMultiplexer'ya bırakmanızı ö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.

Bakım bildirimini ilerlet

Yaklaşan bakımı öğrenmek için bildirimleri kullanın. Daha fazla bilgi için bkz. Planlı bakımdan önce bildirim alabilir miyim?

Bakım zamanlaması penceresi

Önbellek ayarlarınızı bakım için ayarlayın. Önbelleğinizdeki olumsuz etkileri azaltmak için bir bakım penceresi oluşturma hakkında daha fazla bilgi için Kanalı güncelleştirme ve Güncelleştirmeleri zamanlama konularına bakın.

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ı

Redis için Azure Cache'in boşta bağlantılar için 10 dakikalık zaman aşımı vardır. 10 dakikalık zaman aşımı, sunucunun istemci uygulaması tarafından terk edilmiş kaçak 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 heartbeat veya keepalive komutları gönderme özelliğine 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.