1

我正面临在会话实例模式下托管 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:

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

我的问题是...

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

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

谢谢

4

2 回答 2

0

There are three seperate but connected issues here:

  • Your design requires that you maintain state between calls
  • You are dependent upon getting to the same server each time (since you store state in memory)
  • You have a limit of 200 connections per server

A solution where you are dependent on coming back to the same server will not work (well) on Windows Azure.

You could implement a Sticky IP cluster, that would solve most of your problems, but it would not guarrantee that no more than 200 connections are on one server. For the most part this would be OK.

You could store the cache in Appfabric Cache, then it would not matter which server you returned to.

You could redesign your system so that all state is stored in the database.

于 2012-06-16T15:55:21.820 回答
0

“我是否应该要求硬件团队设置 NLB...” 根据您的说法,Shiraz 的“粘性 IP 集群”是最接近托管给定 scnerio 的人。

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

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

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

于 2012-06-27T04:35:19.723 回答