我正在编写一个应用程序,该应用程序具有在两个实例之间并行运行的多个(数百个)并发网络操作。由于连接的平均生命周期很短(最多几秒),我认为使用许多 TCP 连接并每次握手(尤其是 TLS 握手)的开销太大。
我开始研究一些实现多路复用的协议(protocol)和库(主要是 AMQP 实现,如 Apache Qupid 、 RabbitMQ ,如 this question 的答案中提到的)。然而,它们似乎都在 TCP 上运行,这引入了一些开销并且没有多大意义( this post 很好地解释了这个问题,并得出 TCP 多路复用是愚蠢的结论)。而且它们都感觉很胖,我更喜欢小而轻的东西(ZeroMQ不幸的是没有实现复用afaik)。这让我开始思考使用 UDP 是否是一种选择。当然,必须正确实现恢复和 ACK 等内容,但了解连接上的多个流应该比简单使用 TCP 更有效。
你认为我上面的推理是正确的,还是我错过了一些重要的事情?有没有好的 C/C++ 库可以通过 UDP 实现多路复用?
最佳答案
做可能有效的最简单的事情,并仅在必要时使其变得更复杂:
使用单个 TCP 连接并通过其复用逻辑 session
- 例如,如果这些逻辑实体只是异步请求/响应对,您可能可以完全省去显式逻辑 session
如果每个实例中有多个并发组件,这些组件确实需要自己的队列并通过回推来限制过度渴望的发送者:
- 首先考虑限制发送端未完成的请求/事件 session 的数量,而不是要求特定的确认
- 仅当您需要动态改变队列长度时(例如,因为您确实试图限制工作内存,而工作内存因 session 而异),请为此使用显式逻辑确认
只有当您遇到逻辑 session 与 TCP 交互确实很糟糕的情况时,才考虑实现您自己的可靠流控制数据报协议(protocol)
关于c++ - 使用多路复用搜索 C/C++ 网络库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13251925/