Instruções: Como lidar com erros
Instruções: Como lidar com erros
Introdução
Este guia aborda o tratamento de erros ao interagir com a API C2C. O tratamento adequado de erros HTTP é um componente essencial de uma integração robusta com qualquer serviço de terceiros.
Tipos de erros
Os erros em sua integração podem ter diversas origens, que podemos classificar em quatro grupos principais:
- Erros de E/S: originam-se de operações de hardware no seu dispositivo, como falhas em operações de leitura/gravação
- Erros de aplicativo: surgem de problemas no código do aplicativo
- Erros de rede: ocorrem na pilha de rede e são comunicados pela biblioteca de rede
- Erros de API: gerados pelos serviços de back-end do Frame.io
Cada categoria de erro requer considerações específicas de tratamento. Este guia se concentra principalmente em erros de API, embora também abordemos estratégias gerais para as outras categorias.
Como os erros de API são retornados
A API do Frame.io comunica erros por meio de dois mecanismos principais:
- Códigos de status: códigos de erro HTTP que indicam a natureza do problema
- Mensagens de erro: conteúdo que fornece detalhes adicionais sobre o erro, especialmente quando várias condições de erro compartilham o mesmo código de status
Códigos de status de erro
Os códigos de status HTTP são respostas numéricas padronizadas que informam o resultado de uma solicitação HTTP. Para mais informações, consulte a documentação sobre códigos de status HTTP da Mozilla ou HTTP Cats, que oferece uma abordagem mais visual. Cada ponto de acesso da API do Frame.io especifica um código de status de sucesso esperado, normalmente 200 (OK), 201 (Created) ou 204 (No Content). Você pode verificar se a solicitação foi bem-sucedida verificando esses códigos específicos ou confirmando se o código está dentro do intervalo de 200 a 299. Códigos de status acima de 399 indicam erros. A maioria dos erros de API retorna códigos 4XX (400-499), o que significa problemas do lado do cliente. Erros fora desse intervalo geralmente se originam da infraestrutura de rede entre o seu dispositivo e o nosso serviço, com a notável exceção do 500 (Internal Server Error), que indica um problema inesperado em nosso servidor. Da mesma forma, uma resposta 404 (Not Found) pode ser gerada por serviços intermediários, e não pelo nosso back-end, apesar de ser um código 4XX.
Caso encontre códigos de status inesperados, notifique nossa equipe.
Esquemas de conteúdo de erros
O Frame.io retorna detalhes de erros em dois formatos: simples e detalhado. Sua lógica de tratamento de erros deve acomodar ambos os formatos.
Esquema de erro simples
Aqui está um exemplo de uma solicitação com falha devido a um client_secret incorreto:
Resposta:
O esquema simples contém apenas um único campo para identificação de erros.
Esquema detalhado de erros
Para comparação, aqui está uma solicitação sem a devida autorização:
Resposta:
Erros detalhados contêm um campo message que identifica o tipo de erro.
Determinar o tipo de erro
Ao lidar com erros do Frame.io, verifique primeiro se há um conteúdo de erro e, se não houver, recorra ao código de status HTTP.
Aqui está uma implementação básica de tratamento de erros:
As tabelas de consulta de erros mencionadas neste exemplo estão disponíveis no final deste guia.
Erros da AWS
Ao fazer o upload de blocos de arquivos, você interage diretamente com o AWS S3, que possui seu próprio formato de erros. Consulte a documentação sobre erros comuns da AWS para obter mais detalhes. Como regra geral, os erros não fatais da AWS devem ser repetidos pelo menos uma vez.
Os erros da AWS são retornados como XML:
O elemento Code identifica o tipo de erro.
Repetição de tentativas para erros
Quando repetir a tentativa
As tabelas de erros neste guia indicam quais erros de API devem ser repetidos. Para erros não relacionados à API, de operações de E/S, bibliotecas de rede ou da AWS, considere repetir a tentativa para aqueles que possam resultar de condições transitórias. Congestionamento de rede, interrupções temporárias do servidor ou perda de pacotes normalmente justificam tentativas de repetição. A maioria das bibliotecas de rede gera um TimeoutError quando uma solicitação demora demais, o que é um dos principais motivos para uma nova tentativa.
Em caso de dúvida, tente novamente uma vez
Ambientes de computação podem enfrentar problemas imprevisíveis. Mesmo com erros que parecem fatais, muitas vezes vale a pena fazer uma nova tentativa. Estados temporários do sistema, anomalias de hardware (como inversões de bits causadas por raios cósmicos) ou condições raras de memória podem causar erros aparentemente fatais que se resolvem na segunda tentativa. Alguns erros, no entanto, não devem ser repetidos. Por exemplo, uma resposta 409: CHANNEL PAUSED ao criar um ativo indica que o dispositivo está em pausa e não deve fazer o upload. Esse estado é intencional e é improvável que mude com uma nova tentativa.
Backoff exponencial
O Frame.io implementa limitação de taxa, e exceder esses limites gera um erro 429: Slow Down ou um status 400 com este conteúdo:
Ao receber essas respostas, implemente o backoff exponencial para novas tentativas. Uma fórmula recomendada para calcular o atraso (em segundos) é:
Em que attempt começa em 0. Isso gera atrasos de 0,5 s, 1 s, 2 s, 4 s, 8 s, 16 s e 32 s, com todas as tentativas subsequentes aguardando 32 segundos.
Aleatoriedade do backoff
Recomendamos adicionar aleatoriedade (jitter) ao seu tempo de backoff para evitar a sincronização de solicitações entre vários dispositivos que estão se recuperando da mesma condição de erro. Isso ajuda a mitigar o problema do thundering herd, em que muitos dispositivos tentam novamente simultaneamente após uma interrupção. Uma boa abordagem é adicionar um deslocamento aleatório entre 0 e metade do atraso calculado: math.rand(0, delay // 2).
Embora o backoff exponencial seja essencial para erros de limitação de taxa, ele também é benéfico para lidar com falhas de rede e de E/S em geral. Essa abordagem permite que restrições temporárias de recursos sejam resolvidas sem carga adicional proveniente de suas tentativas de repetição.
Detecção do status de desconexão
Quando ocorrem erros de rede, eles podem indicar que o Frame.io está inacessível devido a:
- Sua rede local está fora do ar
- Os serviços do Frame.io estão apresentando problemas
- Um componente intermediário da rede está com falha
É importante detectar essas condições. Quando um erro sugerir problemas de conectividade, implemente uma tarefa de monitoramento que verifique se o serviço foi restaurado e informe o usuário sobre a desconexão.
Aguardando conexão e autorização
Projete seu aplicativo para evitar fazer solicitações desnecessárias quando o dispositivo estiver atualizando a autorização, aguardando a autorização do usuário ou incapaz de acessar o Frame.io. Isso reduz a sobrecarga da rede e melhora a experiência do usuário.
Bloqueie todas as chamadas de API (exceto para https://api.frame.io/health) ao detectar um estado de desconexão. Quando surgirem problemas de conectividade, inicie uma tarefa em segundo plano que verifique o ponto de acesso de integridade e bloqueie novas chamadas de API até que a conectividade seja restaurada.
Da mesma forma, caso ocorra a expiração do token, bloqueie as chamadas que dependem de autorização até que um novo token seja emitido. Se a atualização do token falhar, avise o usuário para que ele se autentique novamente.
Ao verificar o status da conexão, aplique a mesma abordagem de backoff exponencial descrita anteriormente.
Tempos limite de solicitação
Configure valores de tempo limite adequados para os diferentes tipos de solicitações:
- Padrão: 15 segundos para solicitações básicas
- Atualização de autorização: 2 minutos para levar em conta o possível processamento no back-end
- Upload de blocos de arquivo: 5 minutos para acomodar redes lentas ao transferir dados maiores
Exemplo de manipulador de repetição de tentativa
Aqui está uma implementação em pseudocódigo que mostra o tratamento de erros com backoff exponencial:
Tabelas de erros
As tabelas a seguir classificam os erros da API do Frame.io e fornecem orientações para o tratamento desses erros. Veja a seguir o que cada coluna representa:
message: O identificador do conteúdo da mensagem de erro http code: O código de status HTTP error type: Uma categoria de erro conceitual (detalhada na seção descrições) schema: O formato do conteúdo do erro (simples ou detalhado) retry: Recomendação de nova tentativa (yes para várias tentativas, once para uma única tentativa, no (para erros fatais) Os asteriscos (*) indicam considerações especiais detalhadas na seção descrições.
Mensagens de erro do Frame.io
Códigos de status do Frame.io
Erros da AWS
Consulte a documentação da AWS para obter descrições detalhadas.
Análise de erros semelhantes da AWS
Tanto o SlowDown quanto o ServiceUnavailable da AWS indicam problemas na taxa de solicitações e podem ser tratados de forma semelhante ao erro SlowDown do Frame.io, implementando o backoff exponencial. Da mesma forma, o InternalError da AWS corresponde conceitualmente ao InternalServerError em nossa API.
Descrições
AccessDenied
Retornado quando um usuário recusa a autorização durante o emparelhamento do dispositivo.
AuthorizationPending
Indica que o usuário ainda não inseriu o código de emparelhamento do dispositivo. Continue fazendo a consulta após o período interval especificado na resposta do código do dispositivo.
ChannelPaused
O canal do dispositivo estava pausado quando o ativo foi criado. Não tente fazer o upload deste ativo novamente.
ExpiredToken
O código de emparelhamento do dispositivo expirou. Gere um novo código e reinicie o processo de emparelhamento.
InternalServerError
Indica um problema inesperado no back-end. Tente novamente uma vez e, por favor, relate erros 500 à nossa equipe para investigação. Observe que alguns problemas conhecidos retornam erros 500 quando deveriam retornar InvalidRequest:
- Tentativa de upload para um canal de dispositivo inexistente
- Solicitação de uma contagem de blocos personalizada inválida
InvalidArgument
Um parâmetro do conteúdo continha um valor inválido. Verifique se os valores dos parâmetros correspondem às expectativas da API.
InvalidContentType
O cabeçalho Content-Type da solicitação não é suportado. A API geralmente aceita:
form/multipart(somente pontos de acesso de autorização)application/x-www-form-urlencoded(todos os pontos de acesso)application/json(pontos de acesso que não sejam de autorização)
InvalidClient
As credenciais fornecidas (client_id, client_secret, etc.) não foram reconhecidas. Verifique as credenciais da integração.
InvalidClientVersion
O cabeçalho x-client-version foi duplicado ou contém uma semantic version inválida.
InvalidGrant
O tipo de concessão de autorização é inválido. Consulte os guias de autorização para obter os valores corretos.
InvalidRequest
Os parâmetros da solicitação ou o formato do conteúdo estão incorretos. Verifique os nomes dos campos e os formatos dos valores.
Se recebido durante a atualização do token, seu token de atualização expirou e você deve reiniciar o processo de autorização.
SlowDown
Você excedeu os limites de taxa de solicitações. Implemente um backoff exponencial para as solicitações subsequentes. Observe que fazer várias solicitações de código de dispositivo na mesma conexão TCP pode acionar esse erro. Crie novas conexões para cada solicitação de emparelhamento.
UnauthorizedClient
Normalmente indica que o access_token está vencido ou ausente. Se você receber esse erro, atualize seu token antes de tentar novamente.
Se ocorrer durante a atualização do token, você deverá reiniciar o processo de autorização e solicitar que o usuário se reconecte.
Esse erro também pode ocorrer ao acessar recursos fora do escopo de autorização do seu dispositivo ou quando um projeto desativou dispositivos C2C. Verifique se você solicitou os escopos apropriados durante a autorização.
Se esse erro ocorrer durante a atualização do token, todo o processo de autorização deverá ser reiniciado com a intervenção do usuário.
Próximas etapas
Recomendamos que você entre em contato com nossa equipe caso tenha alguma dúvida e consulte o guia avançado de uploads. Esperamos poder apoiar o andamento da sua integração. Caso ainda não tenha feito isso, revise o guia Implementação do C2C: Configuração antes de prosseguir. Você precisará do access_token obtido durante o processo de autenticação e autorização. Este guia se baseia no guia de Uploads básicos e no guia de Uploads avançados.