2

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

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

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

谢谢

4

1 回答 1

5

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

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

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

于 2012-08-06T08:30:18.023 回答