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

时间:2012-08-06 08:22:10

标签: .net sockets networking socketasynceventargs

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

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

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

由于

1 个答案:

答案 0 :(得分:5)

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

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

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

相关问题