1
resposta

Varias requisições para um mesmo destino com lentidão

Boa noite, tenho a seguinte situação:

Preciso fazer uma requisição a uma API, passando Algumas informações e o tipo de retorno desejado como no exemplo abaixo:

{
  "cnpjfilialemissora": "",
  "periodoInicial": "",
  "periodoFinal": "",
  "cnpj_cpfcliente": "",
  "codigocliente": 0,
  "faixanumerosctes": [],
  "faixachavesctes": [
        {
          "Chave": "35210801599101000193570030332829641469282336"
        },
        {
          "Chave": "35210801599101000193570030332830261620382335"
        }
    ],
  "tipoExtracao": 1,
  "tipoRetorno": "PDF"
}

Existem 2 tipos de retorno: XML e PDF

O retorno da API é um hash de um zip em base64, que eu preciso decodificar e fazer o download.

PROBLEMA 1: A API só aceita um máximo de 500 chaves de CTE por requisição; PROBLEMA 2: A API demora demais pra retornar quando ao tipo de Retorno é igual a PDF, e quando for, aceita um máximo de 350 chaves, caso contrário dá erro de servidor. (Isso é algo que eu já pontuei para os desenvolvedores da API);

E agora vem o maior problema de todos:

O sistema que eu trabalho é de uma transportadora, e o volume de dados que eles trabalham é imenso!

Quando o usuário precisa fazer um download, seja ele de XML ou de PDF, normalmente ele faz através de um número de fatura do sistema. É muito comum que uma fatura tenha 10 mil CTE's, e até mais.

O que eu preciso fazer para retornar esses downloads é:

  • Buscar no banco de dados todos os CTE's.
  • Dividir tudo em blocos de 500 CTE's. faço isso adicionando cada bloco de 500 como um índice de um array associativo.
  • Fazer um foreach em cada índice contendo 500 CTE's;
  • A cada 500 CTE's eu faço a request para pegar o hash, decodifica-lo e gerar o download;

O Meu maior problema é que a demora é enorme, e por isso eu gostaria de saber se é possível aplicar esses conceitos de assincronicidade nesse problema que eu tenho.

Exemplo de problema:

$arrCtes = [
    request1 => 500chaves,
    request2 => 500chaves,
];

foreach($arrCtes AS chaves) {
    request_para_buscar_o_zip; => aqui demora muito tempo
}

PS: o sistema todo foi desenvolvido em uma espécie de Zend 1.. eu falo "espécie" pq foi todo modificado para se adequar à necessidade.

1 resposta

Cara, nao sei se entendi muito bem o problema, mas a grosso modo, parece que esse trecho do codigo está com muita responsabilidade.

Já pensou em separar isso responsabilidades separadas, usar um serviço de mensageria, e consumir isso e enviar para o cliente, seja em lote ou individual ?