Ruby Net :: HTTP второй запрос при тайм-ауте - PullRequest
2 голосов
/ 03 июля 2019

Я заметил, что по истечении времени ожидания http Ruby (2.6.1) делает второй запрос Это вызывает проблемы с одной из наших конечных точек, потому что запускается второй рабочий, который потребляет ресурсы.

Вы можете увидеть пример здесь: Перейдите на https://beeceptor.com/console/timeout и выполните следующий код

require "net/http"

http = Net::HTTP.new("timeout.free.beeceptor.com", 443)
http.read_timeout = 1
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.request(Net::HTTP::Get.new("/Time"))

Вы можете видеть, что есть 2 запроса к /Time, поэтому мне было интересно:

  1. Какова цель этого поведения по умолчанию? Когда я делаю тот же запрос с помощью команды curl, я не получаю второй запрос curl --max-time 1 https://timeout.free.beeceptor.com
  2. Как я могу повлиять на это поведение?
  3. Или я что-то не так делаю?

1 Ответ

2 голосов
/ 03 июля 2019

Это особенность Net::HTTP, которая повторяет идемпотентные запросы.Вы можете ограничить количество повторных попыток, установив max_retries (в вашем случае 0).

Подробнее об этой проблеме на Ruby redmine

require "net/http"

http = Net::HTTP.new("timeout.free.beeceptor.com", 443)
http.read_timeout = 1
http.max_retries = 0 # <<<<<<<< the change
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.request(Net::HTTP::Get.new("/Time"))
...