如何使用我的WCF路由器/负载平衡服务注册“PerCall”WCF服务?

时间:2013-12-09 17:41:51

标签: wcf

我正在开发一个项目,该项目使用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()方法,或者我是否需要使用单例方法,并自己处理线程?

如果某些事情没有意义,请告诉我,我会尽力澄清。

1 个答案:

答案 0 :(得分:0)

根据您的方案的简要回顾,我想您可能想要考虑.Net路由服务。

Routing Service是一个通用SOAP中介,充当消息路由器。路由服务的核心功能是能够根据消息内容路由消息,这允许消息根据消息本身中的值(在标头或消息正文中)转发到客户端端点。 RoutingService在System.ServiceModel.Routing命名空间中实现为Windows Communication Foundation(WCF)服务。

虽然这并没有直接解决您的问题,但我可以从经验中说,我们的团队在路由服务方面取得了积极的成果。

此致