是否有正当理由不TcpListener
用于实现高性能/高吞吐量TCP
服务器而不是SocketAsyncEventArgs
?
我已经实现了这个高性能/高吞吐量的 TCP 服务器SocketAsyncEventArgs
,使用一个大的预先分配的byte
数组和SocketAsyncEventArgs
用于接受和接收的池来处理那些固定的缓冲区,使用一些低级的东西和闪亮的智能放在一起带有一些 TPL 数据流和一些 Rx 的代码,它工作得很好;几乎是这方面的教科书——实际上我已经从别人的代码中学到了超过 80% 的这些东西。
但是也存在一些问题和担忧:
- 复杂性:我不能将此服务器的任何类型的修改委托给团队的其他成员。这将我限制在这类任务中,我无法对其他项目的其他部分给予足够的关注。
- 内存使用(固定
byte
数组):SocketAsyncEventArgs
需要预先分配使用池。因此,为了处理 100000 个并发连接(更糟糕的情况,即使在不同的端口上),一大堆 RAM 无用地悬停在那里;预先分配(即使这些条件只是在某些时候满足,服务器应该能够每天处理 1 或 2 个这样的峰值)。 TcpListener
实际上效果很好:我实际上已经进行TcpListener
了测试(使用了一些技巧,例如AcceptTcpClient
在专用线程上使用,而不是async
版本,然后将接受的连接发送到 a 而不是就地ConcurrentQueue
创建s 等)和最新版本的 .Task
NET,它工作得非常好,几乎和 .NET 一样好SocketAsyncEventArgs
,没有数据丢失和低内存占用,这有助于在服务器上不浪费太多 RAM 并且不需要预先分配。
那么,为什么我看不到TcpListener
在任何地方被使用并且每个人(包括我自己)都在使用SocketAsyncEventArgs
?我错过了什么吗?