Bana burada birkaç karma teknolojiniz var gibi görünüyor:
iletişim (esasen% 100 güvenilir olarak güvendiğiniz ... ölümcül olabilen)
kilitleme / karşılıklı dışlama
zaman aşımları (hangi amaçla)?
Uyarı: Dağıtım sistemlerindeki zaman aşımları tehlike ve zorluklarla dolu olabilir. Kullanılırsa, çok dikkatli bir şekilde ayarlanmalı ve kullanılmalıdır, çünkü zaman aşımlarının gelişigüzel kullanımı bir sorunu çözmez, sadece felaketi ortadan kaldırır. (Zaman aşımlarının nasıl kullanılması gerektiğini görmek istiyorsanız , HDLC iletişim protokolü belgelerini okuyun ve anlayın. Bu, IDLE satırı gibi şeylerin algılanmasına izin vermek için akıllı bir bit kodlama sistemi ile birlikte uygun ve akıllı kullanıma iyi bir örnektir. .
Bir süre iletişim bağlantıları (TCP değil, başka bir şey) kullanılarak bağlanmış çok işlemcili dağıtılmış sistemlerde çalıştım. Öğrendiğim şeylerden biri, kaba bir genelleme olarak, gidilecek bazı tehlikeli çoklu programlama yerlerinin olmasıydı:
kuyruklara güven genellikle gözyaşlarıyla sona erer (kuyruk doldurulursa, sorun yaşarsınız. SADECE asla doldurmayacak bir kuyruk boyutu hesaplayabilirsiniz, bu durumda muhtemelen kuyruksuz bir çözüm kullanabilirsiniz)
Kilitlemeye güvenmek acı vericidir, başka bir yol olup olmadığını deneyin ve düşünün (kilitleme kullanmanız gerekiyorsa, literatüre bakın, çok işlemcili dağıtılmış kilitleme son 2-3 yıldaki birçok asedemik kağıdın konusu olmuştur)
Ben kilitleme kullanarak devam etmek zorunda, o zaman:
Zaman aşımlarını yalnızca son çare kurtarma aracı olarak kullanacağınızı varsayacağım - yani temel iletişim sisteminin arızasını tespit etmek için. Ayrıca TCP / IP iletişim sisteminizin yüksek bant genişliğine sahip olduğunu ve düşük gecikme süresi olarak düşünülebileceğini varsayacağım (ideal olarak sıfır, ancak bu asla gerçekleşmez).
Ne önerebilirim her düğüm bağlanabilir diğer düğümlerin bir bağlantı listesine sahip olmasıdır. (Düğümler bir bağlantının nereden geldiğini umursamazlar.) Bir düğümün bağlanabileceği tabloların popülasyonu, sıralamak için ayrı bir şey olarak bırakılır, bunun statik olarak ayarlanıp ayarlanmayacağını söylemediniz. Ayrıca, bağlantıların bir düğüme geleceği IP bağlantı noktası numaralarının tahsisi gibi şeyler de göz ardı edilir - yalnızca tek bir bağlantı noktasında veya birden fazla bağlantı noktasında istekleri kabul etmek için iyi nedenler olabilir. Bunun dikkatle ele alınması gerekir. Örtük kuyruk, sipariş, kaynak kullanımı, işletim sistemi türü ve yetenekleri içerecektir.
Düğümler kime bağlandıklarını öğrendikten sonra, o düğüme bir kilit isteği gönderebilir ve bu uzak düğümden gelen bir kilit yanıtından geri almaları gerekir. Atomik görünmesi için bu iki işlemi bir sargıya paketleyebilirsiniz. Bunun etkisi, bir kilit almak isteyen düğümlerin aşağıdaki gibi bir arama yapmasıdır:
if (get_lock(remote_node) == timeout) then
{
take some failure action - the comms network is down
}
/* Lock is now acquired - do work here */
if (release_lock(remote_node) == timeout) then
{
take some failure action - the comms network is down
}
get_lock ve release_lock çağrıları aşağıdaki gibi olmalıdır (prensipte):
send_to_remote_node(lock_request)
get_from_remote_node_or_timeout(lock_reply, time)
if (result was timeout) then
return timeout
else
return ok
Bir kilit basılıyken gerçekleştirilen iş birimlerinin küçük ve hızlı olması nedeniyle dağıtılmış bir kilitleme sistemi ile çok dikkatli olmanız gerekir çünkü kilit almak için beklemede olan birçok uzak düğümünüz olacaktır. Bu, etkili ancak mümkün olan en yüksek performansa sahip olmayan, dur ve bekle çok işlemcili / iletişim sistemidir.
Bir öneri tamamen farklı bir yaklaşım benimsemektir. Her RPC çağrısının alıcı tarafından işlenebilen ve kilit gereksinimlerini ortadan kaldıran bir bilgi paketi taşıdığı uzak yordam çağrısı kullanabilir misiniz?
Soruyu yeniden okurken, şeylerin iletişim tarafı ile gerçekten ilgilenmek istemiyorsunuz, sadece kilitleme sorununuzu çözmek istiyorsunuz gibi görünüyor.
Bu nedenle cevabım biraz konu dışı görünebilir, ancak altında kalan parçaları da doğru yapmadan kilitleme sorununuzu çözemeyeceğinize inanıyorum. Analoji: Kötü temeller üzerine bir ev inşa etmek onun yıkılmasına neden olur ... Sonunda.