积极答复者
将wcf部署到NLB群集中的问题

问题
-
目前我讲WCF部署到了NLB群集中, A和B两台服务器,
WCF协议采用TCP, NLB 的设置为单播,
客户端发出一个请求到NLB 的公共IP, NLB会随机发送到A或B服务器,
但是,除非客户机退出,该客户端C1只要发出的请求都会始终在一台服务器上。比如,客户端第一次请求,是A服务器处理的,那么只要A一直在调用服务,那么C1的所有请求都自动路由到A服务器上。
我要的效果是 客户端每次请求,是A或B 随机一个台,而不是固定到其中一台。
我修改了下我的程序,每次客户端代理类调用服务完毕,加上Abort(), 就可以实现,下次调用是随机被分配到A或者B服务器。
如果不加Abort(),而 使用Close(), 调用仍然聚集在一台机器上。
不知道我的问题,说清楚了没有。
===================
我想既然使用了wcf 做分布式,就应该考虑分布式部署,然后考虑负载的问题。
答案
-
reliableSession class
中没有 属性 enabled的属性, 当然这么配也不对
MSDN上有介绍啊。http://msdn.microsoft.com/zh-cn/library/ms731343.aspx
<reliableSession ordered="Boolean"
inactivityTimeout="TimeSpan"
enabled="Boolean" />
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
- 已标记为答案 castlooo 2011年4月13日 9:54
全部回复
-
我想问一下你服务使用的绑定,WCf是不是使用了回话?
WCF回话机制是,一个客户端Proxy会对应一个服务端实例,也就是这个Proxy发出的请求,都是由一个服务实例来处理。
如果你使用了回话,比如NetTcpBinding,默认就使用回话,那么客户端同一个Proxy的请求,都会由一个服务实例处理。
你可以把服务端的实例回话模式,修改为PerCall,也就是单调,每个请求,都是由一个服务实例处理。
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
-
namespace WCFService { [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)] public class WCFServices : IServices { .............. } }
这个是服务的代码,我使用的是percall
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
-
用的 netTcpBinding,会话没配置过。
<netTcpBinding> <binding name="NewBinding20M" closeTimeout="00:30:00" openTimeout="00:30:00" receiveTimeout="05:00:00" sendTimeout="05:00:00" maxConnections="1000" maxReceivedMessageSize="2147483647"> <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="10240" maxNameTableCharCount="16384" /> <security mode="None" /> </binding> </netTcpBinding>
-
namespace WCFService { [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)] public class WCFServices : IServices { int m_Counter = 0; /// <summary> /// 测试联通 /// </summary> string IServices.Test() { m_Counter++; return m_Counter.ToString(); } } }
测试下列代码,每次都返回1
应该每次都是新的实例。
-
namespace WCFService { [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)] public class WCFServices : IServices { int m_Counter = 0; /// <summary> /// 测试联通 /// </summary> string IServices.Test() { m_Counter++; return m_Counter.ToString(); } } }
测试下列代码,每次都返回1
应该每次都是新的实例。
netTcpBinding默认启用会话。你可以在绑定里设置Session为False。
客户端和服务端都设置下。
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
-
貌似nettcpbinding 不能无会话
啊不能无会话?
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
-
netTcpBinding默认启用会话。
你可以在绑定里设置Session为False。
客户端和服务端都设置下。
这是是设置哪里? <reliableSession enabled = "false"/>
enabled 属性不存在。msdn上如此写,调试不过
这个直接在绑定里设置啊<reliableSession enabled = "false"/>
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
-
reliableSession class
中没有 属性 enabled的属性, 当然这么配也不对
MSDN上有介绍啊。http://msdn.microsoft.com/zh-cn/library/ms731343.aspx
<reliableSession ordered="Boolean"
inactivityTimeout="TimeSpan"
enabled="Boolean" />
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
- 已标记为答案 castlooo 2011年4月13日 9:54
-
应该是搞定了~ THANKS XU!
那就好啊。Welcome~
记得请客吃饭哈哈
我还一直以为我记错了
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/