TCP连接何谓“翻腾”?

8
在Web服务的上下文中,我见过术语“TCP连接翻转”的使用。具体来说,Twitter finagle有方法可以避免发生这种情况。它是如何发生的?它是什么意思?
1个回答

9
这个术语可能有多种用途,但我经常看到它在许多TCP连接在非常短的时间内被建立时使用,导致客户端和潜在的服务器性能问题。
这通常发生在客户端代码编写自动连接任何类型的TCP失败时。如果此故障恰好是在连接之前(或协议交换早期)发生的连接故障,则客户端可能进入近似繁忙循环不断进行连接。这可能会导致客户端性能问题-首先是在非常繁忙的循环中存在一个进程吸收CPU周期,其次是每个连接尝试都会消耗客户端端口号-如果这足够快,软件可以在达到最大端口号时进行包装(由于端口仅是16位数字,因此这确实是不可能的)。
写出健壮的代码是一个值得追求的目标,但这种简单的“自动重试”方法有点太幼稚了。在其他情境中也会出现类似的问题——例如,父进程不断重新启动立即崩溃的子进程。避免这种情况的一种常见机制是采用某种递增的退避策略。因此,当第一次连接失败时,您立即重新连接。如果在短时间内(例如30秒)再次失败,则等待2秒后重新连接。如果在30秒内再次失败,则等待4秒,以此类推。阅读维基百科关于指数退避的文章(或者这篇博客文章可能更适合此应用程序),以了解更多关于这种技术的背景知识。
这种方法的优点是它不会使客户端或服务器不堪重负,但也意味着客户端仍然可以在没有手动干预的情况下恢复(特别是对于无人值守服务器上的软件或大型集群而言,这一点尤为重要)。
在恢复时间至关重要的情况下,简单的TCP连接创建速率限制也是完全可行的 - 也许不超过每秒1个连接。然而,如果每个服务器有很多客户端,则这种更简单的方法仍然可能会使服务器被接受和关闭高连接率的负载所淹没。
如果您计划使用指数退避,请注意一件事 - 我建议设置最长等待时间,否则您可能会发现持续的故障会导致客户端在服务器端开始再次接受连接后需要太长时间才能恢复。我建议在大多数情况下将最长等待时间设置为5分钟左右,但当然这取决于应用程序。

有道理 - 对于一个客户端无法连接到其他服务器的服务来说,这肯定是一个问题。谢谢你的回答! - eman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接