具有1000个客户端的开始/结束vs socketasynceventargs

use*_*111 2 .net sockets networking socketasynceventargs

我想知道哪种异步类型在开发速度和稳定性方面都是最好的.我正在编写一个概念证明网络应用程序,它必须支持1000个concurent客户端.

每个客户端每秒发送大约5个30字节的数据包.服务器每秒发送大约5个200字节的数据包.

我从早期的测试中得到了这些数字,带有阻塞套接字.我认为我应该使用SocketAsyncEventArgs导致高吞吐量,但开发时间也需要更长的时间.

谢谢

Mar*_*ell 5

IIRC两者之间的主要区别在于SocketAsyncEventArgs无需分配大量对象(即回调等),考虑到吞吐量,这可能是一个有效的问题.特别是,这可以帮助防止由于GC导致的周期性性能下降.另一个好处是混合"这可能会运行异步,或者它可能会运行同步;我会告诉你哪个" - 需要一段时间习惯,但非常方便.

但是,与所有事物一样,任何高吞吐量系统都需要设计为高吞吐量.如果你是从头开始,我很难找到一个使用的理由SocketAsyncEventArgs- 无论哪种方式异步网络IO总是需要一点点头脑和计划.当我们为SE编写Web套接字服务器(处理50k +并发连接)时,一个特别有用的技巧是确保我们回收所有byte[]缓冲区,即从中心缓冲区中取出它们(并将它们返回)当池为空时分配新缓冲区(并且作为必然结果,当池已满时,只在地板上丢弃缓冲区).当然,在那种情况下,我们可能不会每次与所有客户交谈; 如果您要经常与每个客户交谈,另一个选择可能是为每个连接添加一个缓冲区.也许更多的内存开销,但可能会使事情变得更简单.

至于"也需要更长的时间来发展"; 这可能是真的,特别是如果您已经非常熟悉旧的异步模型.我想这归结为拥有一致性能服务器的重要性.当然,这两种方法都需要严格的测试.