Um terceiro que fará solicitações HTTP para a API que estou criando exige que a API responda em menos de um segundo. Minha pergunta é: eles têm uma maneira (literalmente, de qualquer maneira, dentro dos limites dos protocolos http e / ou tcp / ip) de interromper a execução do meu código se demorar mais de um segundo?
8
Respostas:
HTTP não funciona assim. O cliente envia uma solicitação e, em seguida, o servidor envia uma resposta de volta. Nenhuma outra comunicação ocorre. Bem, o servidor pode enviar respostas informativas 1xx antes da resposta principal. Mas não há como o cliente enviar atualizações sobre uma solicitação enviada.
(A situação é muito diferente para o HTTP / 2, que pode multiplexar várias solicitações pela mesma conexão. Um cliente pode CANCELAR um fluxo para indicar que não é mais necessário depois de receber um PUSH_PROMISE do servidor. Ignorarei o HTTP / 2 para o restante desta resposta.)
Além disso, as redes não funcionam assim. Em particular, veja o segundo falácia da computação distribuída : “latência é zero”. Não é. Nesse segundo tempo limite, 400ms podem ter sido gastos no estabelecimento da conexão e no envio da solicitação e 600ms na resposta, porque um dos pacotes foi descartado e você teve que reenviar tudo e seu cliente está na Austrália. Além do problema de o servidor não ter tempo suficiente, ele nem sabe quanto tempo tem porque a latência de resposta não pode ser conhecida antecipadamente.
Portanto, considerando que a implementação literal desses tempos limites é impossível, que tipo de solução pode ser boa o suficiente?
Se a resposta não tiver valor após o tempo limite, o cliente pode simplesmente fechar a conexão. Isso fará com que sua resposta seja ignorada, mas não impedirá a resposta.
Fechar a conexão TCP pela qual a solicitação HTTP é enviada notifica o servidor. Mas essa notificação chega apenas com latência, portanto pode ser tarde demais. Além disso, sua estrutura da web pode não estar fazendo nada quando o soquete do cliente está fechado. Nesse caso, você receberá o erro "redefinição de conexão por pares" quando tentar gravar no soquete fechado.
Se você não deseja gastar mais de um segundo no processamento da resposta, a implementação desse tempo limite é de sua inteira responsabilidade e não tem nada a ver com rede ou HTTP.
Você pode solicitar ao cliente que forneça um tempo limite ao servidor, para que o servidor possa abortar se não cumprir o prazo. Isso pode ser especificado como um cabeçalho personalizado ou como um parâmetro de consulta no URL. Esse prazo deve ser um ponto absoluto no tempo e não uma duração, para que os atrasos na transmissão também consumam o tempo disponível. Mas a precisão de um segundo é difícil: o servidor e o cliente precisam ser sincronizados com a hora correta e precisam usar um relógio adequado. Dependendo da configuração, cada fonte de tempo pode ser desativada em 100ms, mesmo quando configurada corretamente. Isso já consome uma parte significativa do seu orçamento de tempo.
fonte
Suponho que eles poderiam fechar a conexão, mas não sei se isso realmente causaria o cancelamento do seu código - isso dependeria de como o código foi escrito.
Eles também podem enviar outra mensagem que pode significar "você está demorando muito, então não se preocupe", mas nesse caso, você provavelmente já estará preparado para lidar com uma mensagem CANCEL_REQUEST explícita.
fonte