我一直致力于在我的组织内使用WCF 4构建一组企业服务,并且可以使用一些指导。到目前为止,我设计的设置/架构类似于轻量级自定义ESB。我有一个主要的“代理”服务(使用wsHttp),它连接到三个底层的netTcp服务。代理和底层服务共享一个包含模型和契约接口的公共程序集。在代理服务中,我可以从我想要公开的底层服务中选择哪些操作。我们的想法是,根据业务需求,我们可能拥有一套服务核心,而且几乎没有不同的经纪人。我们计划利用AppFabric和WAS在IIS 7.5中托管所有内容(包括netTcp服务)。
这是我的问题,这是一个设计良好的做法,它会扩展吗?这些服务应该能够每天处理数千笔交易。
我已经在WCF 4中使用了路由来代替我提到的代理服务概念,但是,它没有看到很多价值,因为它只是简单地进行重定向。
我也在试图弄清楚如何优化代理服务(假设这种做法是可取的)对底层服务的代理。现在我只需要代理作为经纪人主类中的私有成员。例如:
private UnderlyingServiceClient _underlyingServiceClient = new UnderlyingServiceClient();
我考虑过缓存代理,但是,我担心如果我遇到一个错误,那个时候整个代理都会出现故障并且无法重复使用(除非我发现错误而只是重新实例化)。 / p>
我对这些服务的目标是确保消费它们的客户能够尽快“进出”。快速请求回复。
非常感谢任何输入/反馈。
答案 0 :(得分: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。这只是为了方便起见,但是为了使创建新频道的代码更短。