Um pool de proxies pode conter endpoints com capacidades muito diferentes. Permitir cinquenta operações na aplicação não impede que quarenta e nove delas escolham o mesmo proxy.

Se a política é «no máximo quatro operações em curso através de cada proxy selecionado», expresse essa política diretamente. Mantenha um semáforo por cada identidade de proxy e adquira-o em torno do trabalho que consome a capacidade do proxy.

limits = {proxy: asyncio.Semaphore(4) for proxy in proxy_urls}

async def fetch(session, proxy, url):
    async with limits[proxy]:
        async with session.get(url, proxy=proxy) as response:
            return await response.read()

Este esboço pressupõe que asyncio foi importado e que os URLs dos proxies foram validados. Para pedidos públicos numa rota de proxy público permitida, a lista de proxies HTTP fornece candidatos para os URLs de proxy do aiohttp. Uma aplicação real também deve definir o seu próprio tempo limite de pedido e decidir quantos dados de resposta necessita. Ler um ficheiro grande completamente para a memória é uma decisão de recursos separada.

Mantenha a permissão para a parte cara

Libertar o semáforo assim que os cabeçalhos da resposta chegam pode anular o limite pretendido. Um corpo em streaming pode continuar a usar a ligação muito depois. Mantenha a permissão até o corpo ser consumido ou a resposta ser fechada de acordo com o fluxo de trabalho da aplicação.

Os gestores de contexto aninhados tornam a limpeza visível quando uma exceção ou cancelamento abandona a operação. Evite adquirir manualmente e liberar apenas no fim de uma função bem-sucedida.

Os limites de ligação respondem a outra pergunta

Os limites do conector do aiohttp limitam as ligações segundo as regras documentadas do conector. Continuam úteis ao lado de um semáforo da aplicação. Um limite de ligações por destino não expressa, apenas pelo seu nome, um orçamento partilhado por todos os destinos atribuídos a um proxy.

Distinga também a concorrência da taxa de pedidos. Quatro pedidos de longa duração e quatro pedidos muito curtos usam a mesma quota de concorrência enquanto produzem taxas de pedidos por segundo diferentes. Um serviço com uma política de taxa pode exigir cadência ou um limitador de taxa separado.

Escolha um identificador de proxy estável e não secreto para registos e métricas. Se dois URLs com credenciais se referirem ao mesmo pool de capacidade, decida se devem partilhar um orçamento. Inversamente, portas ou contas diferentes podem representar limites separados quando o operador os documenta assim.

Quando o débito cai, inspecione onde o trabalho espera: o seu semáforo, o conector, o estabelecimento da ligação ao proxy ou a leitura das respostas. Aumentar todos os limites ao mesmo tempo torna essa distinção mais difícil e pode mover a fila para um proxy que não controla.

Artigos relacionados