
Ao trabalhar com APIs para recuperar grandes quantidades de dados (potencialmente milhares de itens), há vários aspectos cruciais a serem considerados, garantindo que o processo seja eficiente, flexível e de alto desempenho. Aqui está uma análise dos principais fatores a serem gerenciados, juntamente com uma solução para usuários de PHP.
Principais considerações ao recuperar grandes dados via API
Deixe-me compartilhar algumas considerações importantes para recuperar com eficiência grandes conjuntos de dados via API:
-
Tratamento de paginação: APIs normalmente entregam dados em páginas. Para recuperar todos os dados, você precisa gerenciar a paginação, realizando várias chamadas de API enquanto acompanha o cursor ou o número da página. Calcular o número de chamadas de API necessárias e gerenciar esse processo é essencial para garantir que você obtenha o conjunto de dados completo.
-
Gerenciamento de memória: ao buscar grandes conjuntos de dados, carregar tudo na memória de uma vez pode sobrecarregar seu sistema. É crucial evitar carregar todos os resultados na memória ao mesmo tempo. Em vez disso, processe os dados em partes, garantindo que seu aplicativo permaneça responsivo e não tenha problemas de memória.
-
Limitação e otimização de taxa: muitas APIs impõem limites de taxa, como restringi-lo a X solicitações por segundo ou Y solicitações por minuto. Para permanecer dentro desses limites, você deve implementar um mecanismo de limitação flexível que se adapte às restrições específicas da API.
-
Solicitações de API paralelas: dada a necessidade de realizar inúmeras chamadas de API devido à paginação, você deseja recuperar os dados o mais rápido possível. Uma estratégia é fazer várias chamadas de API em paralelo, respeitando os limites de taxa. Isso garante que suas solicitações sejam rápidas e compatíveis com as restrições da API.
-
Coleta de dados eficiente: apesar de fazer inúmeras solicitações de API paginadas, você precisa combinar os resultados em uma única coleção, manipulando-os de forma eficiente para evitar sobrecarga de memória. Isso garante um processamento suave de dados, mantendo baixo o uso de recursos.
-
Análise JSON otimizada: muitas APIs retornam dados no formato JSON. Ao lidar com respostas grandes, é importante acessar e consultar seções específicas do JSON com bom desempenho, garantindo que dados desnecessários não sejam carregados ou processados.
-
Tratamento eficiente de exceções: APIs normalmente geram exceções por meio de códigos de status HTTP, indicando problemas como tempos limite, acesso não autorizado ou erros de servidor. É importante lidar com isso usando o mecanismo de exceção fornecido pela sua linguagem de programação. Além do tratamento básico de erros, você também deve mapear e gerar exceções de uma forma que se alinhe à lógica do seu aplicativo, tornando o processo de tratamento de erros claro e gerenciável. A implementação de novas tentativas, registro e mapeamento de erros para exceções significativas garante um processo de recuperação de dados tranquilo e confiável.
A solução PHP "Páginas JSON preguiçosas"
Se você está trabalhando com PHP, você está com sorte. O pacote de código aberto Lazy JSON Pages oferece um raspador de API conveniente e independente de estrutura que pode carregar itens de APIs JSON paginadas em uma coleção lenta do Laravel por meio de solicitações HTTP assíncronas. Este pacote simplifica paginação, otimização, solicitações paralelas e gerenciamento de memória, garantindo eficiência e desempenho.
Você pode encontrar mais informações sobre o pacote e mais opções para personalizá-lo no leia-me do repositório oficial do GitHub: Lazy JSON Pages.
Quero agradecer a Andrea Marco Sartori, autor do pacote.
Exemplo: recuperando milhares de histórias do Storyblok
Aqui está um exemplo conciso de recuperação de milhares de histórias do Storyblok usando o pacote Lazy JSON Pages em PHP.
Primeiro, você pode criar um novo diretório, entrar no diretório e começar a instalar o pacote:
mkdir lazy-http
cd lazy-http
composer require cerbero/lazy-json-pages
Depois que o pacote estiver instalado, você pode começar a criar seu script:
totalItems('total')
->async(requests: 3)
->throttle(requests: 10, perSeconds: 1)
->collect('stories.*');
foreach ($lazyCollection as $item) {
echo $item["name"] . PHP_EOL;
}
Então você pode substituir seu token de acesso e executar o script através do comando php.
Como funciona
-
Paginação eficiente: os resultados da API são paginados e a coleção lenta lida com a busca de todas as páginas sem a necessidade de armazenar tudo na memória.
-
Chamadas de API assíncronas: a linha ->async(requests: 3) aciona três solicitações de API em paralelo, melhorando o desempenho.
-
Throttling: a linha ->throttle(requests: 10, perSeconds: 1) garante que não mais que 10 solicitações sejam feitas por segundo, respeitando os limites de taxa.
-
Eficiência de memória: O uso de coleções lentas permite que os dados sejam processados item por item, reduzindo a sobrecarga de memória, mesmo com grandes conjuntos de dados.
Essa abordagem oferece uma solução confiável, de alto desempenho e com uso eficiente de memória para recuperar grandes volumes de dados de APIs em PHP.
Referências
- O pacote Lazy JSON Pages: https://github.com/cerbero90/lazy-json-pages
- O autor do pacote de código aberto: https://github.com/cerbero90