İstemci Tarafı Donmalarını Önleme
İstemcinin donmasının iki yolu vardır: ağ bağlantısı sunucu isteklerinin kaybolmasına neden olabilir veya sunucunun kendisi çökebilir. Varsayılan seçeneklerle RPC hiçbir zaman bir çağrının zaman aşımına uğratmaz ve istemci iş parçacığınız yanıt almak için sonsuza kadar beklemeye devam eder.
Bunu önlemenin iki yöntemi vardır: canlı tutma ve zaman aşımları.
TCP Bağlantı Koruma
İstemci, sunucunun etkin ve çalışır durumda olduğundan emin olmak için düzenli aralıklarla sunucuya ping atacak şekilde ayarlanabilir. Pingler, ncacn_ip_tcp ve ncacn_http protokol dizileri için TCP etkin tutma işlemleridir ve bu nedenle CPU kullanımı ve ağ bant genişliği açısından verimlidir. Belirli bir uzak yordam çağrısında etkin tutma özelliğini etkinleştirmek için, çağrı başlatılmadan önce rpcmgmtSetComTimeoutişlevinikullanın. Bu işlev, bir bağlama tutamacı ve bir zaman aşımını bağımsız değişken olarak alır. RpcMgmtSetComTimeout 'den sonra bu bağlama tutamacında yapılan her uzak yordam çağrısı sağlanan zaman aşımını kullanır.
RpcMgmtSetComTimeout işlevi için Timeout parametresi, RPC çalışma süresi etkin bağlantıları açmadan önce ne kadar süre bekleyeceğini belirtir. Zaman aşımı 0 ile 10 arasında bir değerdir; burada 0 en az zaman aşımıdır ve 10 sonsuz zaman aşımıdır (zaman aşımı yoktur). Zaman aşımı saniyeler içinde değil; rpcmgmtSetComTimeout işlevinin verilen zaman aşımı değerinden saniyelere çeviri, RPC çalışma zamanı tarafından yapılır ve uygulamaya özgüdür.
Aşağıdaki tabloda Windows 2000 ve Windows XP için saniyelere çeviri sağlanır. Windows'un gelecekteki sürümleri, Timeout parametresiyle zaman aşımı değeri arasındaki eşlemeyi saniye cinsinden değiştirebilir:
Zaman aşımı parametresi | Gerçek zaman aşımı süresi (saniye cinsinden) |
---|---|
0 (RPC_C_BINDING_MIN_TIMEOUT) | 120 |
1 | 240 |
2 | 360 |
3 | 480 |
4 | 600 |
5 (RPC_C_BINDING_DEFAULT_TIMEOUT) | 720 |
6 | 840 |
7 | 960 |
8 | 1080 |
9 (RPC_C_BINDING_MAX_TIMEOUT) | 1200 |
10 (RPC_C_BINDING_INFINITE_TIMEOUT) | Sonsuz zaman aşımı |
Canlı tutma özelliği açıldıktan sonra istemci her saniye bir canlı tutma paketi gönderir. Sunucudan üç veya daha fazla aktif durum sinyali karşılığı yoksa, istemci bağlantıyı ölü olarak bildirir ve uzak yordam çağrısı başarısız olur. Sunucu belirtilen zaman aşımı içinde bir yanıt gönderirse canlı tutma özelliği açılmaz. Sunucu canlı tutma işlemine yanıt verir ancak uzak yordam çağrısına yanıt vermezse, istemci canlı tutma göndermeye devam eder. Sunucu RPC çağrısına yanıt verdikten sonra etkin tutma özelliği kapatılır. Windows 2000'de bağlantı devamlılığı yalnızca zaman uyumlu RPC çağrıları için etkindir. Windows XP'de, zaman uyumsuz RPC çağrıları için etkin tutma özelliği de açıktır.
İstemci uygulamasının ağ sorunlarına zamanında yanıt vermesini sağlamak için canlı tutma özelliğini en düşük değere ayarlamak caziptir. Böyle bir cazibeye karşı dikkatli olunmalı ve agresif bir değer verilip verilmediği titizlikle incelenmelidir. Bağlantıyı geçici olarak kaybeden bir sunucu, bağlantı geri yüklendikten sonra çok sayıda istemciden gelen canlı tutma işlemleriyle dolu olabilir. Buna ek olarak, uzun hesaplama görevleri iki dakikadan fazla sürebilir ve sunucu yararlı işler yapmaya kıyasla canlı tutma yanıtlarına daha fazla CPU zamanı harcayabilir. Bu nedenle canlı tutma, denetimli kullanılmalıdır. İstemci, uzun süreler boyunca bağlı olan iş parçacığını tolere edemiyorsa, zaman uyumsuz RPC dikkate alınmalıdır.
Diğer protokol dizileri, hangi taşımanın kullanıldığına bağlı olarak yanıt vermeyen sunucuları algılamak için farklı mekanizmalar uygulayabilir. ncalrpc aktarım "keep alive" kullanmaz. ncalrpc tüm iletişimler yerel olduğundan, bir çağrı devam ederken sunucu yanıt vermez hale gelirse, istemcideki RPC çalışma zamanı çağrıyı hemen başarısız olur.
Arama Molaları
Ağ bağlantısı kesilirse veya sunucu kilitlenirse TCP etkin tutma işlemleri normaldir. Ancak sunucu kullanıcı modunda kilitlenirse TCP etkin tutma başarılı bir şekilde geri döner ancak çağrı hiçbir zaman geri dönmez. Bu senaryoyla başa çıkmak için Windows XP için yeni bir çalışma zamanı seçeneği eklendi: RPC_C_OPT_CALL_TIMEOUT. Bu seçenek, RPC çalışma süresine sunucuya her istek gönderdiğinde bir zamanlayıcı ayarlamasını bildirir. Süreölçerin süresi dolarsa çağrı otomatik olarak iptal edilir ve RPC_S_CALL_CANCELLED ile tamamlanır. Sunucu belirtilen süre içinde yanıt verdiği sürece istemci çağrıyı iptal etmeyecektir. Bu, tüm yanıtların gelmesi zaman aşımı süresinden fazla olsa bile, sunucudan gelen her yanıt zaman aşımı süresi içinde alındığından, çok aşamalı çağrının tamamlanması zaman aşımı süresinden daha uzun sürebileceği anlamına gelir.
Ayrıca, bir çağrı iptal edildiğinde sunucuya iptal bildirisi gönderilmez. Bu nedenle, sunucu büyük olasılıkla bir noktada çağrıyı yürütür ve istemci sunucudan gelen yanıtı yoksayar.
Arama zaman aşımlarıyla ilgili en tehlikeli tuzak, kısa bir zaman aşımı oluşturmak ve çağrıyı aynı sunucuda yeniden denemektir. Aşağıdaki senaryoda bu yaklaşımın tehlikeleri gösterilmektedir:
Kapasiteye yakın çalışan bir sunucu düşünün. Çok kısa zaman aşımlarına sahip, beş saniye gibi, birkaç müşterisi vardır. Bir yönlendiricide geçici ağ bağlantısı veya tıkanıklık kaybı, sunucu yanıtlarında birkaç saniye boyunca gecikmeye neden olur. Ethernet ağlarında bu durum, sunucunun başka bir makineyle paylaştığı bir bağlantıdaki etkinlik artışlarından kolayca kaynaklanabilir. Sunucu, beş saniyelik zaman aşımından önce tüm yanıtları göndermeyi başaramaz. İstemcilerin aramaları iptal edilir ve hemen yeniden denerler. Sunucu, çağrıların yeniden deneme olduğunu farkında değildir ve bunları da yürütür. Bu nedenle, normal iş yükü olarak çağrı gerçekleştirmek yerine, istemcilerin zaman aşımına uğrama sayısına bağlı olarak 30-50% daha fazla çağrı gerçekleştirir. Bu, kapasitesini aşarsa ve sunucu beş saniye içinde tüm istemcilere yanıt veremezse, sunucuya bir tur daha çağrı gönderilir. İstemciler aynı çağrıları yeniden vermeye devam eder ve sunucu, önceki çağrıları işlerken aşırı yüklendiği için zaman aşımı süresi içinde yanıt veremez. Yanıt verdikten sonra, istemciler bir zaman aşımı süresine ulaşmış, yeni bir çağrı göndermiş ve yanıtı görmezden gelmiştir. En kötü durumda, sunucu yeniden başlatmaya kadar kurtarılmaz ve istemci erişim düzenine bağlı olarak, yeterli sayıda istemci durdurulana kadar kurtarılamayabilir.
Not
Çağrı zaman aşımları yalnızca ncacn_ip_tcp ve ncacn_http protokol dizilerinde çalışır.