我正在使用WCF服務作爲多個「工作服務」的路由器/負載平衡器的項目。基本上,路由器將跟蹤每個工作人員服務工作的工作數量,並將新工作路線發送給負載最少的工作人員。我希望能夠根據需要添加/刪除工作服務/服務器,並且不想維護這些工作服務的靜態列表。每次添加或刪除工作服務時,都需要在路由器上「註冊」和「取消註冊」。如何使用我的WCF路由器/負載均衡服務註冊「PerCall」WCF服務?
This MSDN article簡要描述了我需要完成的工作。
我現在有,是一個WCF服務充當路由器:
[ServiceContract]
public interface IRouterService
{
[OperationContract]
bool RegisterWorker(WorkerService worker);
[OperationContract]
bool UnregisterWorker(WorkerService worker);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class RouterService : IRouterService
{
List<WorkerService> workers = new List<WorkerService>(); //keeps track of worker services
public bool RegisterWorker(WorkerService worker)
{
bool isSuccess = false;
if (workerService.IsValid() && !workers.Any(w => w.EndpointUri == worker.EndpointUri))
{
workers.Add(worker);
isSuccess = true;
}
return isSuccess;
}
public bool UnregisterWorker(WorkerService worker)
{
bool isSuccess = false;
if (workers.contains(worker))
{
workers.Remove(worker);
isSuccess = true;
}
return isSuccess;
}
}
這種「路由器服務」的公共方法,工人服務調用,Register()
並在必要時Unregister()
自己。我遇到的問題是,我希望我的工作服務是InstanceContextMode.PerCall
,它不允許我簡單地在worker服務的構造函數中調用路由器的註冊服務(因爲每次調用服務都會調用構造函數,這對我不起作用)。我可以將工作服務定義爲InstanceContextMode.Single
,但這意味着我需要編寫邏輯來處理多個線程(而不是僅僅依靠WCF使用PerCall
上下文模式根據需要產生/管理儘可能多的線程)。
想法?有一種方法可以在工作人員服務首次聯機時調用路由器的Register()
方法一次,或者我需要使用單例方法並處理自己的線程嗎?
讓我知道,如果有什麼不合理的,我會盡力澄清。
路由服務不僅允許您根據路由信息的內容路由消息嗎?雖然我將不得不根據內容過濾/路由(將正確的消息傳遞給正確的服務類型),但我現在更關心的是能夠通過將相同類型的消息發送到多個工人服務。 –
以下文章提供了有關路由服務和負載平衡的詳細信息。文章部分指出:「總的來說,這是一個更令人愉快的RoundRobin實現,也可以很容易地擴展到其他負載均衡模式,它具有相當小的區別,2)容易理解(特別是與其他實現相比)3)線程安全,4)性能「http://blogs.msdn.com/b/routingrules/archive/2010/04/14/load-balancing-at-the-routing- service.aspx – Seymour
爲了記錄,我結束了單身人士的做法。路由服務可能能夠做我想做的事情,但是從我讀過的所有內容來看,它更多的是將消息過濾到不同類型的服務,而我需要這樣做,以及在可變數字之間進行負載平衡每種服務類型。 –