创建TCP连接的成本很高,建议使用连接池
谢谢杜杜.用连接池的确是可以改善创建连接的效率.
我另外的疑问是:比如有这样的场景,某个系统会用memoryCacheClient类去访问服务端的缓存,这时候一个memoryCacheClient就会创建一个TCP连接.系统中可能会有多线程并发访问.此时有俩种做法
1.memorycache客户端类做成单例,整个系统都共用这个单例建立唯一的TCP连接去访问服务端.
2.实例化多个memoryCacheClient创建多个TCP连接去访问服务端
那么哪种做法对于系统来说是最合适呢?
@garry:
Memcached Client也要用连接池,你也可以看一下EnyimMemcached的实现代码:https://github.com/enyim/EnyimMemcached
@garry: 就用你这个memoryCacheClient实现一个单例,类本身实现一个线程池来应对多线程的访问。
@在大地画满窗子: 用单例,实例化EnyimMemcached的成本很高
@dudu:
也就是说,客户端访问服务端的吞吐量跟连接数无关喽?
碰到这种场景的时候,头脑中首先冒出来的想法就是多线程下载比单线程快,推想是不是几个连接的情况下并发吞吐量要大于单个连接?
@garry: 多线程与MemcacheClient单例没有冲突
@dudu:
好吧,可能是我没有描述清楚,多线程下载实际上是客户端创建了多个连接去服务端请求数据.比单个连接去请求数据要快.
我的问题就是,客户端去服务端访问数据的时候,假设并发非常大的情况下,是用唯一的一个连接好,还是用一定数量的连接好,最终问题的焦点是:在一个连接上执行n多查询和把查询分摊到数个连接上,哪种更好?
@garry: 多线程下载比单线程下载快是因为将一个下载任务分拆为多个,然后通过多线程进行并行下载
@dudu:
那么是不是同理可以这么认为呢:总并发请求1万次,如果用10个(假设)memoryCacheClient的实例,每个分摊1000次请求去访问MemoryCache服务器,比用一个memoryCacheClient实例去请求1万次,客户端的延迟更低,响应时间更快?
@garry:
用10个MemcacheClient实例,性能会更差。因为创建MemcacheClient实例的开销很大。
总并发请求1万次,会需要1万个TCP连接,与多个MemcacheClient实例没有关系。
如果总并发请求通常在1万次,建议将EnyimMemcached的socketPool->minPoolSize设置为1万。
@dudu:
谢谢杜杜,关于这个场景我已经弄明白了,我理解的这里是短连接的场景,每个请求都是新建一个连接,用完就关闭,所以连接池对这种场景下非常重要.
如果是长连接的场景下呢,客户端是用一个连接好,还是用多个连接好呢?
比如说要访问netTcpBinding下的wcf服务,客户端要去并发访问,是每次创建一个代理用完就Close,还是共享一个wcf代理的单例,所有的访问都通过这个单例出去?
@garry: 建议每次用完就Close
@dudu:
嗯,好吧.目前正在对项目中的WCF调用进行性能测试,发现大部分的时间开销是消耗在了wcf代理的Open和Close上了,直接共用一个代理,并发高了之后又碰到调用超时的问题...
@garry: 建议找出具体在哪里调用超时了
我可以路过吗 啊haha ~
好吧,我不太懂你们聊的东西;不过我这边用异步去创建TCP连接进行操作,在性能很一般的CPU占用2%左右情况下,100个线程能处理1000多个连接;是1线程对多连接...LZ要的是1连接对多线程好传输快...猜想如果能在每个连接下动态的开多个异步,也应该可以实现合理的资源分配.
其实我的问题也很初级的,大致上就是通过TCP连接去访问服务端资源的过程中,连接会不会成为客户端的瓶颈,共用一个连接还是用多个连接的问题
@garry: 多个连接应该只造成资源的浪费。
理论上应该是在一个连接下,开多个线程去收发。当然这需要服务端的支持。