【问题标题】:WCF Session Instancing Mode Hosting IssueWCF 会话实例模式托管问题
【发布时间】:2012-06-16 06:07:58
【问题描述】:

我正面临在会话实例模式下托管 WCF 的情况。我正在封装实际情况并提出一个示例来复制它......如下所示。

要托管的服务是“MyService”。我正在使用 Windows 服务来托管它。使用 http 端点。
它将需要支持 500 个并发会话。(单例和 Percall 无法完成,因为合同是基于工作流的...登录...Function1,Function2,Logout..)
我有 4 台服务器,每台都具有支持 200 个并发会话的硬件能力。
因此,我将一台服务器上的服务配置为路由器(ServiceHost S = new ServiceHost(RouterService)),其托管路径为“http://myserver/MyService”。我设置了一个简单的负载平衡机制,并应用路由器表将传入请求重定向到托管实际服务副本的其他三台服务器...("http://myserver/MyService1","http://myserver/MyService2 ","http://myserver/MyService3")

它仍然不工作...一旦点击超过 200...通信错误开始...我想是因为当进行 500 个并发调用时,路由器(能力 200)也需要保持连接与实际服务服务器一起发送给客户端......(在会话调用模式下)......我的想法正确吗??

我的问题是……

1) 我的方法是正确的还是概念上有缺陷...我应该要求硬件团队设置 NLB...
2) 我们是否应该专门重新设计合同以确保可以通过 PerCall 以某种方式发出请求...
3) 有人建议此类系统应托管在云 (Windows Azure) 上...需要查看所涉及的成本...但它是否正确...
4) 托管 WCF 处理基于会话的调用时涉及的最佳实践是什么。

我知道我的问题很复杂,不会有一个“正确”的答案......但任何帮助和见解将不胜感激。

谢谢

【问题讨论】:

    标签: wcf session concurrency load-balancing


    【解决方案1】:

    “我应该要求硬件团队设置 NLB ...”吗? Shiraz 的“Sticky IP cluster”是最接近给定 scnerio 的主机。

    问题是 WCF 会话是基于传输的。因此我们不能像传统的 aspnet 那样将这些“会话”存储在状态服务器/数据库上。

    WCF4.0 提出了新的绑定,例如 NetTcpContextBinding、BasicHttpContextBinding、WSHttpContextBinding,可以帮助跨机器环境重新创建上下文。但是我没有生产实现知识提供示例。

    This 文章应该可以帮助您了解更多...

    【讨论】:

      【解决方案2】:

      这里有三个独立但相互关联的问题:

      • 您的设计要求您在调用之间保持状态
      • 您每次都需要访问同一个服务器(因为您将状态存储在内存中)
      • 每台服务器的连接数限制为 200 个

      依赖于返回同一服务器的解决方案在 Windows Azure 上将无法正常工作。

      您可以实施一个粘性 IP 集群,这将解决您的大部分问题,但它不能保证一台服务器上的连接数不超过 200 个。在大多数情况下,这是可以的。

      您可以将缓存存储在 Appfabric Cache 中,然后返回到哪个服务器都没有关系。

      您可以重新设计您的系统,以便所有状态都存储在数据库中。

      【讨论】:

        猜你喜欢
        • 2012-03-30
        • 1970-01-01
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 2011-10-09
        • 1970-01-01
        • 2020-06-25
        相关资源
        最近更新 更多