在Azure服务总线、Redis缓存、队列等中,什么时候单个TCP通道不够用?



我在很多地方看到过这种推荐,例如:

多工厂:由同一工厂创建的所有客户端(发送方和接收方)共享一个TCP连接。最大消息吞吐量受到可以通过此TCP连接的操作数量的限制。单个工厂可以获得的吞吐量随着TCP往返时间和消息大小的不同而变化很大。为了获得更高的吞吐率,您应该使用多个消息传递工厂。

你可以找到类似的Redis, RabbitMQ等的推荐。我的问题是,一个TCP通道是如何耗尽的?我相信在单个TCP通道上没有带宽限制。

那么,为什么人们建议有多个通道来获得高吞吐量呢?是因为:

  1. 如果客户端应用程序向单个tcp通道发送大量小消息,则每个操作将在tcp套接字上取一个锁,然后发送消息。这可能导致锁争用。

  2. 使用多个tcp通道,可以在一定程度上解决这个争用问题。
  3. 如果在tcp通道上发送大消息,它可能需要一些时间来序列化/反序列化并将其推送到通道。它可以阻止其他小消息。

这些是真正的原因吗(或者如果这些假设是错误的,真正的原因是什么)?

基本上,你是对的。客户端1 -> TCP/IP ->服务器(做一些处理)现在,客户机2想要向服务器发送请求吗?客户机2将需要等待客户机1完成(我假设这里的上下文是关于阻塞I/O的)。因此,如果您有多个TPC连接,客户机2可以与客户机1同时发送请求==>提高吞吐量。但保持更活跃的连接是有成本的。你应该确保你有"足够的"连接来满足你的请求,并尽量减少"空闲"连接的数量。

最新更新