我目前正在与WCF玩一会儿,在此期间,我提出了一个问题,我不确定自己是否在正确的轨道上。
让我们假设一个简单的设置,如下所示:client - > service1 - >服务2。 通信是基于tcp的。
所以我不确定的是,service1是否有意义缓存service2的客户端代理。所以我可能会获得对该代理的多线程访问,我必须处理它。
我想利用tcp会话来获得更好的性能,但我不确定WCF / network /是否支持这种“架构”。我看到的问题是,如果我没有使用锁或其他同步,所有通信都会通过同一个通道。
我想更好的想法是将代理缓存在一个threadstatic变量中。 但在我这样做之前,我想确认只有一个代理实例真的不是一个好主意。
TIA 马丁
答案 0 :(得分:1)
如果你不知道你有性能问题,那么为什么要担心缓存?您将面临不正当地实施多线程代码的风险,并且没有任何明确,可衡量的好处。
您是否已经测量了性能,或者对应用程序进行了分析以了解它在哪里花费时间?如果没有,那么当您这样做时,您可能会发现多个TCP会话的开销不是您的性能问题所在。您可能希望您有时间优化应用程序的其他部分,但是您将花费时间来优化不需要优化的内容。
答案 1 :(得分:1)
我已经在使用这样的结构了。我有一个服务与其他一些服务合作并实现实现。当然,在我的情况下,客户端调用第一个服务的一些单向方法。我的收益非常好。当然,在某些情况下,我还将其配置为限制并发呼叫的数量。
答案 2 :(得分:1)
是的,WCF支持该架构。我使用NetTCPBinding每天处理使用类似结构的应用程序。
最值得担心的是所涉及的各种服务的ConcurrencyMode,并确保它们不会被不必要地阻止。很容易进入一个可以保证超时的场景,或者至少由于跨服务边界的多个同步调用而导致性能不佳。即使OneWay电话也不能保证立即返回。
答案 3 :(得分:0)
小心使用threadstatic,.net更改线程,以便变量可以为null。
对于会话...也许您可以使用会话启用的呼叫: http://msdn.microsoft.com/en-us/library/ms733040.aspx
但如果您没有任何性能问题,我不会建议您使用。我会使用正常的方式,或者如果服务1仅用于转发,您可以使用4.0轻松使用该功能: http://www.sdn.nl/SDN/Artikelen/tabid/58/view/View/ArticleID/2979/Whats-New-in-WCF-40.aspx
此致
答案 4 :(得分:0)
首先,确保您了解ThreadStatic在ASP.NET应用程序中的行为:
http://piers7.blogspot.com/2005/11/threadstatic-callcontext-and_02.html
启动请求的同一个线程可能与完成它的线程不同。基本上,在ASP.NET应用程序中存储Thread本地存储的唯一安全方法是在HttpContext中。下一个明显的方法是创建一个包装器客户端来管理您的WCF客户端代理,并使用锁确保每个IO请求都是线程安全的。
虽然我的个人偏好是使用代理客户端池。每当你需要一个弹出游泳池队列的时候,当你完成它时就把它重新打开。