2011-12-14 79 views
4

我一直致力于在组织内部使用WCF 4构建一组企业服务,并且可以使用一些指导。我迄今设计的设置/体系结构类似于轻量级定制ESB。我有一个主要的“代理”服务(使用wsHttp),连接到三个底层netTcp服务。代理和底层服务都共享一个包含模型的常见程序集以及合同接口。在代理服务中,我可以从我想要公开的底层服务中选择哪些操作。我们的想法是,根据业务需要,我们可能有一套服务核心和几个不同的经纪商。我们计划利用AppFabric和WAS在IIS 7.5中托管所有内容(包括netTcp服务)。WCF路由/ ESB架构?

这是我的问题,是这样的设计良好的做法,它会扩大规模?这些服务应该能够处理每天数以千计的交易。

我用WCF 4中的路由代替了我刚才提到的代理服务概念,但是没有看到太多的价值,因为它只是简单地进行重定向。

我也想弄清楚如何优化代理服务(假设这种做法是可取的)对基础服务的代理。现在我只是将代理人作为经纪人主类中的私人成员。例如:

private UnderlyingServiceClient _underlyingServiceClient = new UnderlyingServiceClient(); 

我已经考虑缓存代理服务器,然而,我担心,如果我碰到一个错误,在这一点上,整个代理是有故障,不能再使用(除非我赶上了故障,只是重新实例)。

我的这些服务的目标是确保使用它们的客户可以尽快地“进出”。快速的请求回复。

任何输入/反馈将不胜感激。

回答

0

如果我理解正确,那么您可能会在单独的计算机上安装一些“后端”服务。然后你有一个“fontend”服务,它基本上像后台代理一样,但在代码中完全可定制。我们正在使用机架中的几台计算机进行确切的设置。我们的前端是IIS7,后端是几台机器上的一堆wcf服务。

一,它会缩放吗?好吧,在后端添加更多的处理能力非常简单,编写一些负载均衡代码也不错。对我们来说,问题在于前端陷入困境,尽管它只是作为代理。我们最终增加了几个前端电脑,就像你打电话给他们的那个“经纪人”。这很好。人们建议我使用Microsoft ForeFront进行自动负载平衡,但我还没有研究它。

二,你应该缓存代理吗?我会说肯定是的,但它有点糟糕。这些通道偶尔会出现故障。我有一个线程始终在后台运行。每3秒唤醒一次,检查应用程序中的所有wcf服务和wcf客户端。任何故障都会被破坏并重新创建。

检查主机通道:...

while(true) 
{ 
    try{if(MyServiceHost.State!=System.ServiceModel.CommunicationState.Opened) {ReCreate();}} catch{} 
    System.Threading.Thread.Sleep(3000); 
} 

检查客户渠道:...

private static ChannelFactory<IMath> mathClientFactory = new ChannelFactory<IMath>(bindingHttpBin); 
    while(true) 
    { 
    try 
    { 
     if(MyServiceClient.State==System.ServiceModel.CommunicationState.Faulted) 
     { 
     EndpointAddress ea = new EndpointAddress(ub.Uri); 
     ch = WcfDynamicLan.mathClientFactory.CreateChannel(ea); 
     } 
    } 
    catch{} 
    System.Threading.Thread.Sleep(3000); 
    } 

在客户端,我不仅缓存渠道,也是缓存的ChannelFactory。这只是为了方便起见,尽管使创建新频道的代码更短。