Faraday: ์—ด๊ธฐ ๋ฐ ์ฝ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ๋Œ€ํ•œ TimeoutError ๊ตฌ๋ณ„

์— ๋งŒ๋“  2017๋…„ 08์›” 09์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: lostisland/faraday

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์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฌ๊ธฐ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

feature help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @coberlin ์ €๋Š” ์ด๊ฒƒ์ด ์ข‹์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด
๊ทธ๋Ÿฌ๋‚˜,์ด์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค OpenTimeoutError ๋ฐ ResponseTimeoutError ์—์„œ ์ƒ์†์— TimeoutError , ๊ทธ๋ž˜์„œ ๊ธฐ์กด์˜ rescue ์˜ˆ์ƒ๋Œ€๋กœ์˜ ์ž‘๋™ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
ํ™•์‹คํžˆ ํ…Œ์ŠคํŠธํ•ด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ƒ

๋ชจ๋“  32 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @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๊ฐœ์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด๋ฆ„์€ ์ตœ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํŒจ๋Ÿฌ๋ฐ์ด::์˜ค๋ฅ˜::OpenTimeoutError
  • ํŒจ๋Ÿฌ๋ฐ์ด::์˜ค๋ฅ˜::ReadTimeoutError

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๊ฐ ์–ด๋Œ‘ํ„ฐ ๋กœ ์ด๋™ํ•˜์—ฌ ๊ทธ์— ๋”ฐ๋ผ ์–ด๋Œ‘ํ„ฐ ์˜ˆ์™ธ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ: HTTPClient์˜ ๊ฒฝ์šฐ:

  • HTTPClient::ConnectTimeoutError ==> Faraday::Error::OpenTimeoutError
  • HTTPClient::ReceiveTimeoutError ==> Faraday::Error::ReadTimeoutError
  • HTTPClient::TimeoutError ==> Faraday::Error::TimeoutError (Faraday ๋˜๋Š” ํŠน์ • ์„ค์ •์— ํ•ด๋‹น ๋งคํ•‘์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ SendTimeoutError๋„ catchํ•ฉ๋‹ˆ๋‹ค)

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. :)

์–˜๋“ค ์•„.

์šฐ๋ฆฌ๋Š” ์ด ํ† ๋ก ์„ "์กฐ๊ธˆ" ์ „์— ํ–ˆ์Šต๋‹ˆ๋‹ค(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 ์˜ ํ•˜์œ„ ๋ฒ”์ฃผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋” ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์—์„œ ๊ฐ„๋‹จํ•œ ์ƒํ™ฉ(์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Œ)์„ ์ทจํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋ฌด์—‡์„ ํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ?

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์—ด๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋ฒ„๋ธ”์—…ํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ฒฐ์ •
  2. ๋ชจ๋“  ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋™์ผํ•œ ๋™์ž‘์œผ๋กœ ํ‘œ์ค€ํ™”

@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 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ฃผ์š” ์š”์ ์„ ์š”์•ฝํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ v1.0 ๋ถ„๊ธฐ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Œ).
  2. ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ด€๋ฆฌ ๋™์ž‘์€ ์–ด๋Œ‘ํ„ฐ ๊ฐ„์— ์ผ๊ด€๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฅผ ํ‘œ์ค€ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•ฉ์˜๋œ ํ–‰๋™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  4. OPEN ์‹œ๊ฐ„ ์ดˆ๊ณผ์˜ ๊ฒฝ์šฐ ConnectionFailed ์—์„œ ์ƒ์†๋˜๋Š” ConnectionOpenTimeout ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  5. READ ์‹œ๊ฐ„ ์ดˆ๊ณผ์˜ ๊ฒฝ์šฐ 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์ด ํ›จ์”ฌ ๋” ๋นจ๋ฆฌ ์ถœ์‹œ๋  ์˜ˆ์ •์ธ ๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

์•Œ์•˜์–ด์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰