这里是否需要超时重试?

Is a retry necessary here in a timeout?

我有以下代码:

task :wait_for_vault_ssl_up do
  Timeout::timeout(15) do
    begin
      TCPSocket.new('localhost', 8200).close
      puts "Vault ssl up and ready!"
      true
    rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError
      puts "Vault ssl not ready... retrying"
      retry
      false
    end
  end
  rescue Timeout::Error
    false
end

在此,我设置了 15 秒的超时并尝试连接到 localhost:8200 我的问题是,如果它没有启动,我目前正在重试以进行救援。这是必要的还是会自动继续尝试连接 15 秒?

使用retry将重新尝试执行整个被拯救的区块。所以在这种情况下,retry 将在您调用 TCPSocket.new 时重新开始执行。这将在异常被挽救后立即发生,不会有延迟。

正如 Stefan 在评论中提到的,您应该在调用 retry 之前使用 Kernel#sleep。这将继续重试直到中断,因此如果您发现自己处于 SSL 连接永远不会准备就绪的情况下,代码将永远循环。您可以跟踪重试次数,或者继续使用 Timeout::timeout,使用更长的超时长度,此时循环应该完全放弃。

我认为更清晰、更简单的解决方案是使用重试计数器,并在预定义的重试次数后放弃。