asp.net - WCF 路由/ESB 架构?

标签 asp.net wcf architecture soa n-tier-architecture

我一直致力于在我的组织内使用 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/

相关文章:

c# - ASP.NET 路由在内部是如何工作的?

javascript - Href 导航到 Div 标签

c# - 是否可以在网络浏览器或框架中自动执行按钮点击和文本输入。如果有必要,甚至可以使用桌面工具?

asp.net - 输入元素未将 "flush"与 DIV 容器对齐

wcf - 我得到 For TransferMode.Buffered, MaxReceivedMessageSize 和 MaxBufferSize 必须是相同的值

wcf - 在运行时更改使用基本身份验证的 OData/WCF 数据服务的连接字符串

web-services - 微服务架构 : Cross Service data sharing

java - Android 应用程序和外部数据库之间通信的最佳方式

java - 这是什么设计模式?

c# - 存储库、删除对象、模型与 ID