faraday/adapter/rack.rb์์ ์ด๊ธฐ ๋ฐ ์ฝ๊ธฐ ์ ํ ์๊ฐ ๋ชจ๋์ ๋ํด TimeoutError๊ฐ ๋ฐ์ํฉ๋๋ค.
timeout = env[:request][:timeout] || env[:request][:open_timeout]
response = if timeout
Timer.timeout(timeout, Faraday::Error::TimeoutError) { execute_request(env, rack_env) }
else ... end
https://stackoverflow.com/questions/10322283/what-is-timeout-and-open-timeout-in-faraday ์ ๋ฐ๋ฅด๋ฉด open_timeout์ tcp ์ฐ๊ฒฐ์ ์ํ ๊ฒ์ด๊ณ timeout์ ์๋ต ์ฝ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ์๊ฐ ์ด๊ณผ์ ๋ํด ๋ณ๋์ ์์ธ ์ ํ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ฒญ์ ์ฌ์๋ํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. Faraday::Error::OpenTimeoutError ๋ฐ Faraday::Error::ResponseTimeoutError์ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ๊ณ ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ต๋๊น?
์๋
ํ์ธ์ @coberlin ์ ๋ ์ด๊ฒ์ด ์ข์ ์ถ๊ฐ ๊ธฐ๋ฅ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด
๊ทธ๋ฌ๋,์ด์ ๋ํ ๊ฐ๋ฅํ ์๋ฃจ์
์ ๊ฐ์ง ์ ์์ต๋๋ค OpenTimeoutError
๋ฐ ResponseTimeoutError
์์ ์์์ TimeoutError
, ๊ทธ๋์ ๊ธฐ์กด์ rescue
์์๋๋ก์ ์๋ ์ ์งํฉ๋๋ค.
ํ์คํ ํ
์คํธํด๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค ๐
rack_adapter๋ ์ด ๊ธฐ๋ฅ์ ์๋ชป๋ ์์น์ผ ์ ์์ต๋๋ค. ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ฐ๋์ ์ด๊ธฐ ๋ฐ ์ฝ๊ธฐ ์ ํ ์๊ฐ์ ๊ตฌ๋ณํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ ์ด ๊ธฐ๋ฅ์ด HTTPClient ์ด๋ํฐ๋ ๋ค๋ฅธ ์ด๋ํฐ์์ ์๋ํ ๊น์? ์ด๋ํฐ/httpclient.rb์์:
@app.call env
rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT
raise Faraday::Error::TimeoutError, $!
rescue ::HTTPClient::BadResponseError => err
if err.message.include?('status 407')
raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
else
raise Faraday::Error::ClientError, $!
end
rescue Errno::ECONNREFUSED, IOError, SocketError
raise Faraday::Error::ConnectionFailed, $!
rescue => err
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
raise Faraday::SSLError, err
else
raise
end
::HTTPClient::TimeoutError์๋ 3๊ฐ์ ํ์ ํด๋์ค ConnectTimeoutError, ReceiveTimeoutError, SendTimeoutError๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด http://www.rubydoc.info/gems/httpclient/2.1.5.2/HTTPClient/TimeoutError ์ฐธ์กฐ
Faraday์๋ ์ด๋ฏธ Faraday::Error::ConnectionFailed๊ฐ ์์ต๋๋ค. ConnectTimeoutError์ ์ ํฉํฉ๋๊น? Faraday::Error::TimeoutError๋ Faraday::Error::ReceiveTimeoutError ๋ฐ Faraday::Error::SendTimeoutError๋ก ํ์ ๋ถ๋ฅ๋ ์ ์์ต๋๋ค.
Faraday์๋ ์ด๋ฏธ Faraday::Error::ConnectionFailed๊ฐ ์์ต๋๋ค. ConnectTimeoutError์ ์ ํฉํฉ๋๊น?
์ด๊ฒ์ ์๋ฏธ๊ฐ ์์ง๋ง ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด ์ด๋ฏธ ์ ํ๋ฆฌ์ผ์ด์
์์ Faraday::Error::TimeoutError
๋ฅผ ํฌ์ฐฉํ๊ณ ์์ผ๋ฏ๋ก ConnectionFailed
์ ํํ๋ฉด ์ด๋ฌํ ์ฌ๋ก๊ฐ ์ค๋จ๋๋ค๋ ์ ์ ๋ช
์ฌํด์ผ ํฉ๋๋ค.
๋์ ์ ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ถ์ ๊ฒ์ Faraday::Error::TimeoutError
๋ํ 2๊ฐ์ ํ์ ํด๋์ค๋ฅผ ์ ์ํ๋ ๊ฒ์
๋๋ค. ๊ทธ ์ด๋ฆ์ ์ต๋ํ ์ผ๋ฐ์ ์ด์ด์ผ ํฉ๋๋ค.
๋ค์ ๋จ๊ณ๋ ๊ฐ ์ด๋ํฐ ๋ก ์ด๋ํ์ฌ ๊ทธ์ ๋ฐ๋ผ ์ด๋ํฐ ์์ธ๋ฅผ ๋งคํํ๋ ๊ฒ์ ๋๋ค. ์: HTTPClient์ ๊ฒฝ์ฐ:
๋ง์ง๋ง์ผ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํ ์คํธ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. :)
์๋ค ์.
์ฐ๋ฆฌ๋ ์ด ํ ๋ก ์ "์กฐ๊ธ" ์ ์ ํ์ต๋๋ค(https://github.com/lostisland/faraday/pull/324).
๋ค๋ฅธ ์๋๋ฅผ ํ๊ณ ์์ต๋๋ค(https://github.com/mistersourcerer/faraday/tree/718_mrsrcr_timeout-wrapping-2nd-chance). ์งํ ์ํฉ์ด ๋ฐ์ํ๋ ์ฆ์ ์ PR์ ์๋ํ๊ณ ์ด ๊ฒ์ ๋๋ค.
@mistersourcerer๋ , ๋์ง ๊ฐ์ฌํฉ๋๋ค. ํ ๋ก ์ด ์งํ๋์๋ค๋ ์ฌ์ค์ ์ ํ ๋ชฐ๋์ต๋๋ค.
PR์ด ๋ซํ ๊ฒ์ ๋ณด๋ ์ฝ๊ฐ ํผ๋์ค๋ฝ์ต๋๋ค. ํ์ง๋ง ์ฝ๋์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ๊ฒฐ๊ตญ ๋ณ๊ฒฝ ์ฌํญ์ด ์ด๋ป๊ฒ๋ ๋ณํฉ๋์์์ ์ ์ ์์ต๋๋ค ๐
์ด์ ์์
์ Timeout ํ
์คํธ์ ์ด๋ฏธ ์ต์ํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ด ๊ฒฝ์ฐ ๋์์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
OpenTimeoutError
๋ฐ ReadTimeoutError
์ ๋ํ ์ ์ค๋ช
์ด ๋ช
ํํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์๋ ค์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์๊ฐ์ ๊ฐ๊ณ ์๋ฃ๋๋ฉด ํ ๋ฆฌํ์คํธ๋ฅผ ์ฌ์ญ์์ค ๐
์๋ ํ์ธ์ @iMacTia์ ๋๋ค.
์ ๊ธฐ์ต์ด ๋ง๋ค๋ฉด ๋น์ ์ํฉ์ ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค. ํ์ง๋ง ์ ํํ ์ด์ ๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฃผ์ ๋ฌธ์ ๋ ๋ชจ๋ ์ด๋ํฐ์์ ์ผ๊ด๋๊ฒ ์คํจํ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋์ ๋ด ์ฝ๋๊ฐ ๊ทธ ๋น์์ ์ ํ ๋ณํฉ๋์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด์จ๋ , ๋๋ ๋ช ๋
ํ์ ์ด๊ฒ์ ๋ํ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํํ, ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์งํ๋๋์ง ๋ด
์๋ค.
ํ์ฌ _EMSynchrony_์ ๋ํ ํ ์คํธ๋ Travis์์ ์คํจํ์ง๋ง ๋ก์ปฌ์์๋ ์คํจํฉ๋๋ค. ๊ทธ๊ฒ์ ์์ ๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๊ณต๊ฐ๋ "์ด๊ธฐ" PR์์๋ ์ด๋ฅผ ๋ ผ์ํ ์ ์์ ๊ฒ์ผ๋ก ์๊ฐํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ค๋ช ์ ์์ ์ฒ๋ผ ๋ช ํํ๊ณ , ๊ทธ๊ฒ๊ณผ ํจ๊ป ๊ฐ๋ ์๋ฒฝํ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๋ํ ๋ฉ์ง ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@mistersourcerer ๊ฐ์ฌํฉ๋๋ค!
RE ๋ณ๊ฒฝ ์ฌํญ: ๋ฌด์จ ์ผ์ด ์์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง @mislav๊ฐ ๋ง์นจ๋ด ๋ณ๊ฒฝ ์ฌํญ์ ์ฌ๊ธฐ์ ๋ณํฉํ์ต๋๋ค. https://github.com/lostisland/faraday/commit/f73d13ee09814fa68b37efa7bddafa47331948c2
๊ธฐ๋ปํ์ญ์์ค. Errno::ETIMEDOUT
๋ ์ด๋ฏธ ๋๋ถ๋ถ์(์ ๋ถ๋ ์๋์ง๋ผ๋) ์ด๋ํฐ์์ Faraday::Error::TimeoutError
์๋์ ๋ํ๋์ด ์์ต๋๋ค. ๐
@mistersourcerer ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ฌ๊ธฐ ์ปค๋ฐ์ ๋ณด๋ฉด ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด Net::HTTP์ ๊ฒฝ์ฐ OpenConnectionError < ConnectionError
๋ฐ HttpClient์ ๊ฒฝ์ฐ OpenTimeoutError < TimeoutError
2๊ฐ์ ์ ํ์ ํด๋์ค๊ฐ ํ์ํ์ง ๊ถ๊ธํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๊ด๋ จํ์ฌ ์ฝ๊ฐ์ ํผ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ ์ด์ ๋ #438์์ "open timeout" ์ค๋ฅ๋ฅผ ConnectionFailed
๋ก ์ฒ๋ฆฌํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๊ฒ์ ํ๋ฆผ์์ด ์ต์ ์ ๊ฒฐ์ ์ด์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ๊ธธ์ ๊ฐ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒ์ด ํ์ค์
๋๋ค.
์ด์ ์ด๊ฒ์ ๋ ์ด๋ํฐ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ชจ๋ ์ด๋ํฐ์๋ ์ํฅ์ ๋ฏธ์น๋ฉฐ ๋์์ด ์ผ๊ด๋์ง ์์ ์ ์์ต๋๋ค.
v1.0๊ณผ ๋์ผํ ๋์์ผ๋ก ํ์คํํ ๊ณํ์ด๋ฉฐ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐ๋ก ์ ์งํ๊ฒ ์ต๋๋ค.
๋ด ์ด์ ๋๊ธ์ ํ์ ์กฐ์น์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ์ด๋ ค ์๋ ์๊ฐ ์ด๊ณผ์ ๊ฒฝ์ฐ Faraday::ConnectionFailed
์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ฝ๊ธฐ ์๊ฐ ์ด๊ณผ์ ๊ฒฝ์ฐ Faraday::TimeoutError
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ์ด๋ํฐ๊ฐ ํ์ฌ ์๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์๋ํ๊ณ ์์ง๋ง ์ด๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋์์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ 3๋
์ ์ ๊ฒฐ์ ๋ ๊ฒ์ด์ง๋ง ์ฌ๊ธฐ์์๋ ์ ์์ ๊ฒฝ์ฐ์๋ Faraday::TimeoutError
๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ํด ๋
ผ์ํ๊ณ ์์ต๋๋ค(๊ฐ๋ฐฉ๊ณผ ๋ซ๊ธฐ๋ฅผ ๊ตฌ๋ณํ๋ ์ ์ ํ ํ์ ํด๋์ค ํฌํจ).
ํํธ์ผ๋ก๋ ๊ทธ๊ฒ ํ์ค์ ๋ ๊ฐ๊น์ธ ๊ฒ์ด๋ผ๊ณ ์ดํดํ์ง๋ง, ๊ตฌํ์ ๊ด์ ์์ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๋ฉด ์ด๋ฌํ ๋ณํ๋ฅผ ์ ๋นํํ๊ธฐ ์ด๋ ต๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
์๋น์ค์ ์ ํ๋ฅผ ๊ฑธ๊ณ ConnectionFailed
๋ฅผ ๋ค์ ๋ฐ์ผ๋ฉด ๋ด ์ ํ๊ฐ ์ฒ๋ฆฌ๋ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์๋ฒ์ ์ฐ๊ฒฐ๋์ง ์์๊ฑฐ๋ ํธ์คํธ ์ด๋ฆ์ ํ์ธํ ์ ์๊ฑฐ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
TimeoutError
๋ฅผ ๋ค์ ๋ฐ์ผ๋ฉด ๋ด ์์ฒญ์ด ์ฒ๋ฆฌ๋์๊ฑฐ๋ ๋ถ๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ๋์์ ์ ์์ผ๋ฉฐ ์๋ต์ ๋์ณค์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์์ ํ ๋ค๋ฅธ ๊ฒฝ์ฐ์ด๋ฉฐ ๋ด๊ฐ ํธ์ถํ ์๋ฒ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ๋ค์ ํ์ธํด์ผ ํฉ๋๋ค.
open timeout์ TimeoutError
์ ํ์ ๋ฒ์ฃผ๋ก ๋ง๋๋ ๊ฒ์ ๋ ๋ณต์กํ ๋๋ฉ์ธ์์ ๊ฐ๋จํ ์ํฉ(์์ฒญ์ด ์ฒ๋ฆฌ๋์ง ์์)์ ์ทจํ๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ๋ฌด์์ ํ ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ฐ๋์ ์ถ๊ฐ ํ์ธ์ด ํ์ํฉ๋๋ค. ์๊ฐ ์ด๊ณผ?
๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
@coberlin @erik-escobedo @mislav @mistersourcerer ๋ ์์ ์ฌํญ์ ๊ณ ๋ คํ ํ ๊ทํ์ ์๊ฐ์ ๋ฃ๊ณ ์ถ์ต๋๋ค ๐
์ด๋ฆฐ ์๊ฐ ์ด๊ณผ ์ค๋ฅ์ ๋ํด ConnectionFailed
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋์๊ฒ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ๋ค๋ฅธ ์๊ฐ ์ด๊ณผ ์ค๋ฅ์ ์ด๋ฆฐ ์๊ฐ ์ด๊ณผ ์ค๋ฅ๋ฅผ ๊ตฌ๋ณํ์ฌ ์ป๊ณ ์ ํ๋ ๋ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ํฐ ์ผ๊ด์ฑ์ ๊ฒฝ์ฐ ์๋ฅผ ๋ค์ด Net::HTTP
๋ ์๋ ๊ทธ๋๋ก์ง๋ง HTTPClient
๋ ๋ณ๊ฒฝ๋๊ณ ConnectTimeoutErrors๋ TimeoutError ๋์ ConnectionFailed๋ก ๋งคํ๋ฉ๋๋ค.
์ข์ต๋๋ค. ์ผ๋จ ๋ชจ๋ ์ด๋ํฐ๋ฅผ ๋์ผํ ๋์์ผ๋ก ํ์คํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด (v1.0์์๋ ๋ถ๋ช ํ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ผ๋ฏ๋ก)
์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ง์ ๋์ง๊ธฐ:
์ง์ฅ์์ ์ฐ๋ฆฌ๋ Nginx + Kubernetes๊ฐ ๋งค๋ฌ๋ฆฐ ํฌ๋(๋๋ ๋ฌด์ธ๊ฐ)๋ก ๋ผ์ฐํ ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ผ๋ถ Open Timeouts๋ก ๊ณ ํต๋ฐ๊ณ ์์ต๋๋ค. ์ด์จ๋ NetHTTP๋ OpenTimeout ๋ฐ ReadTimeout ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๋ฐ ์ฌ์ฉ๋์์ผ๋ฉฐ ๋๋ฒ๊น ํ๋ ๋ฐ ์ ๋ง ํธ๋ฆฌํ์ต๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ Typhoeus๋ก ์ ํํ์ต๋๋ค. ์ฌํ๊ฒ๋ ๋ชจ๋ ์๊ฐ ์ด๊ณผ๊ฐ ํจ๊ป ๋ญ์ณค์ต๋๋ค. nginx + kuber ๋ฌธ์ ์ ๋ํ ์์ ์ด ๊ฐ์ ๋์๋์ง, ์๋๋ฉด ์ด์ ๋ง ์ ์ ๋ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ ๋ฌธ์ ์ ๋ํด ๋ ๋ง์ ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์ํํ๊ณ ์๋์ง ๋งํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ฒด๊ณ. ์ด๋ ์ชฝ์ด๋ ์ ํ ์๊ฐ์ ์๋ ๊ฑฐ์ ๊ฐ์ผ๋ฉฐ ๋ถ๋ฆฌํ์ง ์๊ณ ์ถ์ธกํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ต๋๋ค.
Faraday::OpenTimeoutError
์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Faraday::TimeoutError
IMO์์ Faraday::OpenTimeoutError
๋ฐ Faraday::ReadTimeoutError
ํ์ฅ๋์ด์ผ ํฉ๋๋ค.
@philsturgeon ๊ณผ ๋ค๋ฅธ ์ ์๋ ์๋ฃจ์ ์ ์ด๋ป์ต๋๊น?
์ด๊ธฐ ์๊ฐ ์ด๊ณผ -> Faraday::ConnectionFailed
์ฝ๊ธฐ ์๊ฐ ์ด๊ณผ -> Faraday::TimeoutError
์ด๋ ๋ชจ๋ ์ด๋ํฐ์์ ์๋ํด์ผ ํ์ง๋ง ๋ถํํ๋ ์ผ๋ถ ์ด๋ํฐ๋ ์์๋๋ก ์๋ํ์ง ์์ต๋๋ค(์: Typhoeus).
๊ทธ๋ฐ ๊ฒ๋ค์ด ๋ค๋ฅธ ๊ฒ ๊ฐ์์.
ConnectionFailed๋ ์๋ชป๋ DNS/IP ๋ฑ๊ณผ ๊ฐ์ด "์ด ์๋ฒ์ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค"์ ๊ฐ์ต๋๋ค.
OpenTimeout์ "๋๋ ์ด ์๋ฒ๊ฐ ์ด๋์์ ์ผ์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์ง ์๊ณ ์์ต๋๋ค."
OpenTimeout์ "๋๋ ์ด ์๋ฒ๊ฐ ์ด๋์์ ์ผ์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์ง ์๊ณ ์์ต๋๋ค."
๋๋ ๊ทธ๊ฒ์ ๋์ํ์ง ์๋๋ค. ๋๋ ์ฐจ๋ผ๋ฆฌ ์ด๋ ๊ฒ ๋งํ๊ณ ์ถ๋ค.
Open Timeout: ์๋ฒ์ ์ ์ํ๋ ค๊ณ ํ์ง๋ง ์ ์ํ ์ ์์ต๋๋ค(์ฐธ๊ณ : ์ฐ๊ฒฐ์ด ์์ง ์ค์ ๋์ง ์์๊ฑฐ๋ "์ด๋ฆผ").
์ฝ๊ธฐ ์๊ฐ ์ด๊ณผ: ์๋ฒ์ ์ฐ๊ฒฐ์ ์ค์ ํ์ง๋ง ์์
(์ถ๋ ฅ ์ฝ๊ธฐ)์ ์ํํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
๊ฒฐํจ์ด ์๋ ๋ฐฉํ๋ฒฝ/ํ๋ก์/load_balancer๋ ๊ณต๊ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์์ผ ๋ฟ์ด์ง๋ง ์ด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ด ์์ง ์์๋์ง ์์์ต๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. "ConnectionFailed"๋ ๋จ์ํ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ด๋ฌํ ๊ฒฝ์ฐ์ ์๋ฒฝํ๊ฒ ๋ง์ต๋๋ค.
๋น์ ์ ์ฌ์ ํ ํน์ ํจ๋ฌ๋ฐ์ด :: OpenTimeoutError์ด ์กด์ฌํด์ผํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด, ๋๋๋ก๋ถํฐ ์์ ํ ๊ฒ์ ๊ฑด์ ํ ๊ฒ์
๋๋ค ConnectionFailed
๋ณด๋ค๋ TimeoutError
๊ทธ๋ฌ๋ ๋๋ ํ์คํ ์ด๋ป๊ฒ์ด ์กฐ๊ธ ํผ๋ ๋ ๊ฒ์ด๋ค ๋์ํ์ง ์ค๋ฌด์ ๋์์ด ๋ ๊ฒ์
๋๋ค.
์ด๊ฒ์ด ์ค์ ๋ก ์ค๋ฅ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง์ ๋ํด์๋ ์ด์ https://github.com/lostisland/faraday/issues/718#issuecomment -343957963์ ์ฐธ์กฐํ์ญ์์ค.
๋ง์ด ๋๋์? ๋ชจ๋์๊ฒ ๋ง๋ ์๋ฃจ์ ์ ์ฐพ๊ณ ์ถ์ต๋๋ค
๊ฐ๋ฐฉ ์๊ฐ ์ด๊ณผ์ ๋ํ ๊ทํ์ ๋ณด๋ค ์ ํํ ์ ์์ ๋์ํ์ง๋ง ๋ค๋ฅธ ๊ฒฐ๋ก ์ ๋๋ฌํฉ๋๋ค.
ํด๋น ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ค๋ ์๊ฐ์ด ์ฐ๊ฒฐ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ฏ๋ก ์ด๊ธฐ ์๊ฐ ์ด๊ณผ๋ฅผ ์ฐ๊ฒฐ ์คํจ๋ก ๊ฐ์ฃผํฉ๋๋ค. "5์ด๋ง์ ์ฐ๊ฒฐ ์คํจ"๋ ๊ทธ๋ ๊ฒ ์ค๋ช ํ๋ฉด ํ์คํ ์ดํด๊ฐ ๋์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ์๊ฐํ๋ ๋ฐฉ์์ ์๋๋๋ค.
๋ง์ ๊ฒฝ์ฐ open timeout์ ์์ง ๋ฐ์
์ฐ๊ฒฐ ์คํจ์ ์ด๊ธฐ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ชจ๋ ๋ค์ ์๋ํด์ผ ํ๋ฏ๋ก ์ฌ๊ธฐ์์ ์ฝ๊ธฐ ์๊ฐ ์ด๊ณผ๊ฐ ์ทจ์ ์ฌ์ ๋ก ๊ฐ์ฃผ๋ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ค์ง ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์ํฉ๋๋ค. ์ฝ๊ธฐ์ ๋ํด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋งํผ ๋ ผ์ํ ์ ์์ง๋ง ์ ์ฉํ ์ ์์ง๋ง ์ ์์ ์ ์ค์ฉ์ฑ์ ๋น์ ์ด ๋งํ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค. Open Timeout์ ๋ฐ์ผ๋ฉด ์์ฒญ์ ๋ค์ ์๋ํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค. ์ฝ๊ธฐ ์๊ฐ ์ด๊ณผ๋ ์์ฒญ์ด ์ฒ๋ฆฌ๋์์ ์ ์์ผ๋ฏ๋ก(์ ์ฒด ๋๋ ๋ถ๋ถ์ ์ผ๋ก) ๋งค์ฐ ์ฃผ์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ฐ์ฐํ๋ open timeout์ ์ค์ง์ ์ธ ์๋ฏธ๋ ์คํจํ ์ฐ๊ฒฐ์ ์๋ฏธ์ ์ผ์นํ๋ฏ๋ก ๊ฑฐ๊ธฐ์์ ์์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ค๋๋ ์ฌ๋๋ค์ ConnectionFailed
๋ฐ TimeoutError
์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ์์ผ๋ฉฐ ๊ทธ ๋ค์ ์๋ ๋
ผ๋ฆฌ๋ ์๋ง๋ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๋งํ ๊ฒ์ ๋ฐ์ํ๊ณ ์์ ๊ฒ์
๋๋ค. ConnectionFailed
์ ํ์ ํด๋์ค๋ก ์ ์์ธ๋ฅผ ๋์
ํ๋ฉด ๋๋ถ๋ถ์(์ ๋ถ๋ ์๋์ง๋ง) ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝ์ด ํ์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
OpenTimeout์ด ํ์์์์ ๋ ๋ค๋ฅธ ์ ํ์ด๋ผ๋ ๊ฒ์ ์๋ฏธ๋ก ์ ๊ด์ ์์ ์ดํดํ๊ณ ๋์ํฉ๋๋ค.
ํ์ง๋ง ๋์ ConnectionTimedOut
๋ผ๊ณ ํ๋ฉด ์ด๋จ๊น์?
open_timeout: X
๊ฐ ConnectionTimedOut
๋์ง ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ์๊ฐ์ ๋ํ๋ด๋ ์์ฑ์ ์ด๋ฆ์ ๋ํด ์ฝ๊ฐ์ ํผ๋์ด ์์ ๊ฒ์
๋๋ค.
์ข์์ ๐
ConnectionOpenTimeout
ํฉ๋๊น? ์ฐ๊ฒฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ด๊ธฐ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ถ๋ช
ํ ํฉ๋๋ค. ๋๋ ์ด ์ด๋ฆ์ด "Failed to make connection in Xseconds"์ ์๋ฏธ์ ๋ฐ๋ผ ์ดํด๋ฅผ ๊ณ์ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น๋ก ์ผ๋ถ ์ฌ๋๋ค์ ์ฌ์ ํ โโ์๊ฐ ์ด๊ณผ๊ฐ ์๊ฐ ์ด๊ณผ๊ฐ ์๋ ์ด์ ๋ฅผ ๊ถ๊ธํด ํ ์ ์์ง๋ง ๋ง์
๋๋ค. ๐
๋์๊ฒ ์ข์ ์๋ฆฌ ๐!
@iMacTia ์ด๋ด, ์ด๋์๋ถํฐ ์์ํด์ผ ํ๋์ง ์๋ ค์ฃผ์๋ฉด ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค.
@philsturgeon ๊ฐ์ฌํฉ๋๋ค. ์ด์ ๋ํ ์ฃผ์ ์์ ์ ์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ConnectionFailed
์์ ์์๋๋ ConnectionOpenTimeout
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.TimeoutError
ํฉ๋๋ค.๋ด๊ฐ ๋์น ๊ฒ ์๋?
ConnectionOpenTimeout
๊ฐ ๊ธฐ๋ณธ Faraday::Request::Retry ์ฒ๋ฆฌ ์์ธ์ ์ถ๊ฐ๋ฉ๋๊น?
@mjhoy ์ข์ ์ง์ ์ด์ง๋ง ํ์ฌ Retry ๋ฏธ๋ค์จ์ด๋ ์ฐ๊ฒฐ ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ฌ์๋ํ์ง ์์ต๋๋ค. ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์ง๋ง ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ง ์์ฒญ์ ์ฌ์๋ํฉ๋๋ค. ์ค์ ๋ก ํธ์ถํ ์๋น์ค์ ์ ํ ์ฐ๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ ์์ฒญ์ ์ฌ์๋ํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์ธ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๊ณ ์ด ๊ฒฝ์ฐ ๋ค๋ฅธ ์์ ์ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ Faraday::Request::Retry
๋ ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ฏ๋ก ์ฒ๋ฆฌํ๋ ค๋ ์์ธ ๋ชฉ๋ก์ ConnectionOpenTimeout
๋๋ ConnectionFailed
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ง์ ์๋ ์์ต๋๋ค.
๊ธฐ๋ณธ ์์ธ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ธฐ ์ ์ "์ปค๋ฎค๋ํฐ ์๊ฒฌ"์ ๋ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋๋๋ก ์ฌ์๋ํด์ผ ํ๋ API ์๋ํฌ์ธํธ์์ OpenTimeout
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ์ Errno::ETIMEDOUT, Timeout::Error,
Error::TimeoutError
์ด๊ณ Net::OpenTimeout
๋ Timeout::Error
์ ํ์ ํด๋์ค์
๋๋ค. ํจ๋ฌ๋ฐ์ด๊ฐ ๊ทธ๋ค์ ๋ค๋ฅด๊ฒ ๋ํ๊ณ ์๋ค๋ ๊ฒ์ ํนํ ๋ถ๋ช
ํ์ง ์์์ต๋๋ค. ๊ทธ๋์ ์๋ง๋ ๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ ๊น์? ์ด์จ๋ ์ฐ๋ฆฌ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด ์๋ฏธ๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
@mjhoy Timeout::Error
์๋ Net::OpenTimeout
๋ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ํ์ฌ ๊ตฌํ์์๋ ์ด๊ธฐ ์ ํ ์๊ฐ๋ ๋ค์ ์๋ํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ฒ๋ค๊ฐ Timeout::Error
๋ ์ ์์ ์ธ ์ํฉ์์ ์ด๋ํฐ์ ์ํด ๊ตฌ์ถ๋๊ณ ๋ค์ ๋ฐ์ ํ๋ฏ๋ก ์์ธ ๋ชฉ๋ก์ ์๋ ๊ฒ์ด ๋ถํ์ํ๊ฑฐ๋ ์ถ๊ฐ ์์ ์ ์ํด ์์ ์ ์์ต๋๋ค.
์์ธ ๋ฆฌํฉํ ๋ง์ด ๋๋๋ฉด Net::OpenTimeout
๊ฐ ์๋ก์ด ์์ธ๋ก ๋ฐ์ํ๊ณ ๋ด ์๊ฒฌ์์ ๋งํ๋ฏ์ด ํ์ฌ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํฉ๋๋ค.
๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ ์ผ๋ถ๊ฐ ์๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์์ ์ ์ํํ๋ ๋์ ํ์คํ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋๋ค.
์ฌ๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
์๋ ํ์ธ์, 1๋ ๋์ ํ ๋ฐฑ๋ก๊ทธ์์ ์ด๊ฒ์ด ์๋คํด์ ธ์ ์ฃ์กํฉ๋๋ค. ์ด์ ์ฐ๋ฆฌ์ ์ฐ์ ์์๊ฐ ๋ง์ด ๋ฐ๋์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํด์๋ ์๋ฌด ์์ ๋ ํ์ง ์๊ฒ ์ง๋ง ํ์ด์ ๋น๋๋ค!
@iMacTia ์ด ๋ณ๊ฒฝ ์์ ์ ํ๋ ์ฌ๋์ด ์์ต๋๊น? ๋๋ ์ด๊ฒ์ v2.0์ ์ ์ฉํ๋ ๊ฒ์ ๊บผ๋ฆฌ์ง ์๋๋ค.
์๋
ํ์ธ์ @ragav0102 , ์ง์ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
์ฐ๋ฆฌ๋ ์ฌ์ ํ v1.0์ ์ถ์ํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์ง ์๋ฌด๋ ์ด ์์
์ ํ๊ณ ์์ง ์์ต๋๋ค.
๋์์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ํ์ง๋ง ์์ง v2.0์ ๋ํ ๊ณํ์ด ์์ผ๋ฏ๋ก ์ธ์ ์ถ์๋ ์ง ์ ์ ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ช ๋ฌ์ ๊ธฐ๋ค๋ ค์ผ ํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ์ค ํ๋์์ ์ด๊ฒ์ด ํ์ํ๋ค๋ฉด ์๋ง๋ ์คํ ๊ฐ๋ฅํ์ง ์์ ๊ฒ์
๋๋ค.
๋ฐฉ๊ธ ํต๊ณผํ๊ณ ๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด v1.0์ด ํจ์ฌ ๋ ๋นจ๋ฆฌ ์ถ์๋ ์์ ์ธ ๊ฒ์ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค ๐
์์์ด์!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ @coberlin ์ ๋ ์ด๊ฒ์ด ์ข์ ์ถ๊ฐ ๊ธฐ๋ฅ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด
๊ทธ๋ฌ๋,์ด์ ๋ํ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๊ฐ์ง ์ ์์ต๋๋ค
OpenTimeoutError
๋ฐResponseTimeoutError
์์ ์์์TimeoutError
, ๊ทธ๋์ ๊ธฐ์กด์rescue
์์๋๋ก์ ์๋ ์ ์งํฉ๋๋ค.ํ์คํ ํ ์คํธํด๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค ๐