我正在开发一个项目,该项目使用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
,这不允许我简单地在工作服务的构造函数中调用路由器的注册服务(因为构造函数会被调用打电话给服务,这对我不起作用)。我可以将工作服务定义为InstanceContextMode.Single
,但这意味着我需要编写逻辑来处理多个线程(而不是仅依靠WCF使用PerCall
生成/管理尽可能多的线程上下文模式)。
思考?有没有办法在工作服务首次上线时只调用一次路由器的Register()
方法,或者我是否需要使用单例方法,并自己处理线程?
如果某些事情没有意义,请告诉我,我会尽力澄清。
答案 0 :(得分:0)
根据您的方案的简要回顾,我想您可能想要考虑.Net路由服务。
Routing Service是一个通用SOAP中介,充当消息路由器。路由服务的核心功能是能够根据消息内容路由消息,这允许消息根据消息本身中的值(在标头或消息正文中)转发到客户端端点。 RoutingService在System.ServiceModel.Routing命名空间中实现为Windows Communication Foundation(WCF)服务。
虽然这并没有直接解决您的问题,但我可以从经验中说,我们的团队在路由服务方面取得了积极的成果。
此致