Eu tenho uma API java (aceitando solicitações HTTPS_ empacotadas em uma imagem do docker e, em seguida, ela é implantada usando o cluster k8s na parte superior dos EC2s. O EC2 principal tem um ELB na frente.
Posso fazer solicitações de POST de ondulação para o ELB para atingir essa API java.
Às vezes, minha solicitação de ondulação fica aguardando uma resposta para sempre, mesmo quando eu vejo os logs do kube o processamento foi bem-sucedido.
Isso acontece para solicitações maiores em torno de 40 minutos, solicitações de 25 minutos estão recebendo uma resposta ok.
Onde você acha que poderia estar o tempo limite? quaisquer parâmetros de configuração específicos que eu deveria olhar?
cliente (curl) -> ELB -> k8s -> pod executando uma imagem da API Java
Eu pensei que isso seria relevante (não estou definindo IdleTimeout) para ELB, mas os documentos dizem que o padrão é 60s, embora eu possa obter resposta para solicitações de 20 minutos "ConnectionSettings": {"IdleTimeout"}
fonte
Respostas:
Assim como Pampy mencionou em sua resposta, o tempo limite do ELB conta apenas o tempo ocioso. Isso pode variar entre 1 e 4000 segundos e é definido como 60 segundos por padrão. Você pode alterar o tempo limite usando a CLI ou o console.
A seguir, é apresentado um exemplo do uso da CLI para alterá-la para 5 minutos:
Fonte: docs
Como você está enviando arquivos grandes com duração de 20 a 40 minutos, ainda recomendo outras sugestões sobre o uso de um intermediário de mensagens como RabbitM ou Kafka para lidar com o upload e o processamento de forma assíncrona.
fonte
O tempo limite do ELB conta apenas para o tempo "inativo" . Isso significa que, enquanto o upload ainda estiver em execução, ele não ficará ocioso. Quando o arquivo chegou ao seu servidor, você precisa medir o tempo até o servidor responder.
Quando isso estiver correto, o servidor processará a solicitação e retornará uma resposta ao cliente posteriormente. Com um tempo limite padrão de 60 segundos, o servidor tem esses 60 segundos para processar o arquivo enviado e retornar uma resposta.
Talvez seu servidor precise de menos de 60 segundos para processar seu upload de 25 minutos, mas mais para processar o upload de 40 minutos?
fonte
Por que você não carrega o arquivo e envia um evento para o broker de mensagens como rabbitMQ. Execute ETL nos arquivos usando o objeto Job / CronJob do kubernetes de forma assíncrona e, portanto, notifique o cliente.
Dessa forma, você não precisa bloquear a solicitação recebida por mais tempo. postar upload após a publicação do evento, envie uma mensagem ao cliente informando que a solicitação está sendo processada.
fonte
25 minutos é bastante longo para uma solicitação HTTP. Concordo plenamente com P Ekambaram.
Eu acho que seria melhor tornar o terminal assíncrono e responder assim que o arquivo for carregado (deve ser mais rápido), ao mesmo tempo, use mensagens de middleware (RabbitMQ, Kafka ou NATS) ou Websocket, que enviam um evento uma vez que o O arquivo é importado e processado com êxito.
fonte
use isso no cLI para alterar o tempo limite para 5 min
fonte