2010-08-10 26 views
7

Üç farklı makinede dengeli bir WCF servis yükü var. WCF servisleri genelinde talep sayısı

bu servisler tipleri A, B ve C taleplerini işleyebilir varsayalım. A veya B işlemek için sınır yoktur. Bununla birlikte, yalnızca bir defada C türünün 5 isteğini işleyebiliriz, bu nedenle C türünün bir 6. isteği içeri girerse, önceki isteklerden biri bitinceye kadar beklemeniz gerekir.

Her üç makinede de yalnızca 5 adet C türünün işlendiğinden nasıl emin olabilirim?

cevap

8

Kesişen bir yarı-yarıçapa ihtiyacınız olduğu gibi, memcached gibi dağıtılmış bir önbelleğe alma çözümünü kullanarak da uygulayabilirsiniz. Alternatif olarak, yük dengeli servisleriniz için semaforu yöneten tek bir makinede çalışan başka bir WCF servisine sahip olabilirsiniz.

Yani yeni hizmet böyle bir şey olabilir:

[ServiceContract] 
public interface ISemaphorService 
{ 
    [OperationContract] 
    void Acquire(); 

    [OperationContract]  
    void Release(); 
} 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class SemaphoreService 
{ 
    private readonly static Semaphore Pool = new Semaphore(5, 5); 

    public void Acquire() 
    { 
     Pool.WaitOne(); 
    } 
    public void Release() 
    { 
     Pool.Release(); 
    } 
} 

gerçek bir dünya uygulamasında bir yapılandırma falan yapılandırılabilir semaforların sayıda isteyebilirsiniz ve bazı zaman aşımları koymak ve mekanizmasını koyarak semaphores'in zamanında yayınlandığından emin olmak ve/veya istemci çöktüğü zaman:

// on the client side (service C) 
var client = new SemaphoreServiceClient(); 

try 
{ 
    // acquire the semaphore before processing the request 
    client.Acquire(); 

    // process request 
    ... 
} 
finally 
{ 
    // always remember the release the semaphore 
    client.Release(); 
} 
+2

Tek bir hata noktası oluşturacağını unutmayın. –