Module: ApiBrasil::Core::Retry
- Defined in:
- lib/api_brasil/core/retry.rb
Overview
Politica de retry do cliente. Por padrao a SDK tenta novamente apenas em HTTP 429 (rate limit) e em falhas de conexao - nunca em timeouts ou erros de negocio, para nao duplicar cobrancas/envios.
Constant Summary collapse
- DEFAULT =
Configuracao padrao:
retries: novas tentativas alem da originalmin_delay_ms: atraso base do backoff exponencialmax_delay_ms: teto do atraso entre tentativasretry_on_statuses: status HTTP que disparam retry
{ retries: 2, min_delay_ms: 300, max_delay_ms: 5000, retry_on_statuses: [429].freeze }.freeze
Class Method Summary collapse
-
.backoff_delay_ms(attempt, retry_config) ⇒ Integer
Backoff exponencial com jitter: min * 2^attempt, limitado a max.
-
.normalize_key(key) ⇒ Symbol
Aceita
minDelayMs(paridade com as outras SDKs) emin_delay_ms. -
.resolve(config) ⇒ Hash?
Normaliza a configuracao de retry.
-
.sleep_ms(milliseconds) ⇒ Object
Pausa a execucao por
msmilissegundos.
Class Method Details
.backoff_delay_ms(attempt, retry_config) ⇒ Integer
Backoff exponencial com jitter: min * 2^attempt, limitado a max.
46 47 48 49 50 51 |
# File 'lib/api_brasil/core/retry.rb', line 46 def backoff_delay_ms(attempt, retry_config) exponential = retry_config[:min_delay_ms] * (2**attempt) jitter = 0.5 + (Kernel.rand * 0.5) [retry_config[:max_delay_ms], (exponential * jitter).round].min end |
.normalize_key(key) ⇒ Symbol
Aceita minDelayMs (paridade com as outras SDKs) e min_delay_ms.
61 62 63 64 65 66 |
# File 'lib/api_brasil/core/retry.rb', line 61 def normalize_key(key) key.to_s .gsub(/([a-z\d])([A-Z])/, '\1_\2') .downcase .to_sym end |
.resolve(config) ⇒ Hash?
Normaliza a configuracao de retry. false (ou nil explicito via
retry: false) desativa completamente.
28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/api_brasil/core/retry.rb', line 28 def resolve(config) return nil if config == false return DEFAULT.dup unless config.is_a?(Hash) normalized = config.each_with_object({}) do |(key, value), acc| next if value.nil? acc[normalize_key(key)] = value end DEFAULT.merge(normalized) end |
.sleep_ms(milliseconds) ⇒ Object
Pausa a execucao por ms milissegundos.
54 55 56 |
# File 'lib/api_brasil/core/retry.rb', line 54 def sleep_ms(milliseconds) Kernel.sleep(milliseconds / 1000.0) if milliseconds.positive? end |