Quando o limite de taxa for atingido, retorne um cabeçalho Retry-After

Hi,

Shouldn’t the delay to wait be in the Response as a Retry-After header?

5 curtidas

Sure, sounds like a good suggestion

3 curtidas

Taking a stab at this :wink:


https://github.com/discourse/discourse/pull/5659


I am assuming:

Retry-After shouldn’t be set in controller actions like the following, where the retry time is (intentionally) hidden from the end user.

https://github.com/xrav3nz/discourse/blob/60e5f39130ca1e4711400955969990fa283fa969/app/controllers/invites_controller.rb#L151

6 curtidas

Hi,

Seems like the PR is merged but I don’t observe any ‘Retry-After’ headers.
Here you can see the body of my error:


And here you can see the headers:

Is this a bug? Thanks in advance

Boa sugestão!

Enquanto isso, o IETF padronizou os cabeçalhos para informar os programas chamadores sobre a limitação de taxa; veja RateLimit Header Fields for HTTP. Nosso software os utiliza para uma variedade de limitadores de taxa (veja Fair Use Daily Limits for a Better User Experience - invantive).

No nosso caso, definitivamente ajudaria se o Discourse retornasse informações de limitação de taxa através de cabeçalhos; os programas não têm acesso ao arquivo de configuração e não temos ideia exata, sem perguntar, quais são as definições. Nosso software chamador também não pode tentar evitar um 429 tentando alternativas quando o limite de taxa está próximo.

Status V3

Na v3, os seguintes cabeçalhos estão presentes que fornecem alguma orientação:

  • Retry-After: número de segundos após os quais a janela de limite de taxa expira e um novo conjunto de chamadas de API é permitido
  • Discourse-Rate-Limit-Error-Code: uma indicação de qual tipo de limite de taxa foi atingido (como admin_api_key_rate_limit ou ip_10_secs_limit).

Em HTTP 429, a carga útil também contém algumas dicas, mas nada adicional em comparação com os cabeçalhos HTTP:

{
    "errors": [
        "i18n text"
    ],
    "error_type": "rate_limit",
    "extras": {
        "wait_seconds": 21,
        "time_left": "21 seconden"
    }
}

Note que esses cabeçalhos são retornados apenas em caso de 429. Não é possível prever uma falha iminente para recuar um pouco.