我一直致力于在我的组织内使用 WCF 4 构建一组企业服务,并且可以使用一些指导。到目前为止,我设计的设置/体系结构类似于轻量级自定义 ESB。我有一个主要的“代理”服务(使用 wsHttp),它连接到三个底层的 netTcp 服务。代理和底层服务共享一个包含模型以及合约接口(interface)的通用程序集。在代理服务中,我可以从我想要公开的底层服务中选择哪些操作。这个想法是,根据业务需求,我们可能会拥有一组核心服务和几个不同的代理。我们计划利用 AppFabric 和 WAS 在 IIS 7.5 中托管所有内容(包括 netTcp 服务)。
这是我的问题,这样的设计是好的做法吗?它会扩展吗?这些服务应该能够每天处理数千笔交易。
我已经使用 WCF 4 中的路由来代替我提到的代理服务概念,但是,它并没有看到太多值(value),因为它只是进行重定向。
我还试图弄清楚如何优化代理服务(假设这种做法是可取的)对底层服务的代理。现在,我只是将代理作为代理主类中的私有(private)成员。例子:
private UnderlyingServiceClient _underlyingServiceClient = new UnderlyingServiceClient();
我考虑过缓存代理,但是,我担心如果我遇到一个错误,那么此时整个代理都会出现错误并且无法重用(除非我发现错误并简单地重新实例化)。
我对这些服务的目标是确保使用它们的客户可以尽快“进出”。快速请求回复。
任何输入/反馈将不胜感激。
最佳答案
如果我对您的理解正确,您可能有一些“后端”服务,可能在不同的计算机上。然后你有一个“fontend”服务,它基本上就像后端的代理,但在代码中是完全可定制的。我们正在使用机架中的几台计算机进行此精确设置。我们的前端是 IIS7,后端是几台机器上的一堆 wcf 服务。
一,它会扩展吗?好吧,在后端添加更多处理能力非常容易,编写一些负载平衡代码也不错。对我们来说,问题是前端陷入了困境,即使它只是充当代理。我们最终添加了几台前端计算机,您称它们为“代理”。这很好用。有人建议我使用 Microsoft ForeFront 进行自动负载平衡,但我还没有研究过。
二、你应该缓存代理吗?我肯定会说是的,但这有点糟糕。这些 channel 偶尔会出现故障。我有一个线程总是在后台运行。每 3 秒,它会唤醒一次,检查应用程序中的所有 wcf 服务和 wcf 客户端。任何有缺陷的都会被销毁并重新创建。
查看主机 channel :...
while(true)
{
try{if(MyServiceHost.State!=System.ServiceModel.CommunicationState.Opened) {ReCreate();}} catch{}
System.Threading.Thread.Sleep(3000);
}
检查客户 channel :...
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);
}
在客户端,我不仅缓存了 channel ,还缓存了ChannelFactory。这只是为了方便起见,使创建新 channel 的代码更短。
关于asp.net - WCF 路由/ESB 架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512141/