这里是否需要超时重试?
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
,使用更长的超时长度,此时循环应该完全放弃。
我认为更清晰、更简单的解决方案是使用重试计数器,并在预定义的重试次数后放弃。
我有以下代码:
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
,使用更长的超时长度,此时循环应该完全放弃。
我认为更清晰、更简单的解决方案是使用重试计数器,并在预定义的重试次数后放弃。