Kumpulan proxy dapat berisi titik akhir dengan kapasitas yang sangat berbeda. Mengizinkan lima puluh operasi di seluruh aplikasi tidak mencegah empat puluh sembilan di antaranya memilih proxy yang sama.

Jika kebijakannya adalah “paling banyak empat operasi berjalan melalui setiap proxy terpilih”, nyatakan kebijakan itu secara langsung. Simpan semafor untuk setiap identitas proxy, dan ambil semafor itu di sekitar pekerjaan yang mengonsumsi kapasitas 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()

Sketsa ini mengasumsikan asyncio telah diimpor dan URL proxy telah divalidasi. Untuk permintaan publik pada rute proxy publik yang diizinkan, daftar proxy HTTP menyediakan kandidat untuk URL proxy aiohttp. Aplikasi nyata juga harus menetapkan batas waktu permintaannya sendiri dan memutuskan berapa banyak data respons yang dibutuhkannya. Membaca file besar sepenuhnya ke memori adalah keputusan sumber daya yang terpisah.

Pertahankan izin untuk bagian yang mahal

Melepaskan semafor begitu header respons tiba dapat menggagalkan batas yang dimaksudkan. Badan yang dialirkan dapat terus menggunakan koneksi jauh setelahnya. Pertahankan izin sampai badan dikonsumsi atau respons ditutup sesuai alur kerja aplikasi.

Manajer konteks bertingkat membuat pembersihan terlihat ketika pengecualian atau pembatalan meninggalkan operasi. Hindari memperoleh secara manual dan melepaskan hanya di bagian bawah fungsi yang berhasil.

Batas koneksi menjawab pertanyaan lain

Batas konektor aiohttp membatasi koneksi menurut aturan terdokumentasi konektor. Batas itu tetap berguna bersama semafor aplikasi. Batas koneksi per tujuan tidak menyatakan, hanya dari namanya, anggaran yang dibagi oleh semua tujuan yang ditetapkan ke satu proxy.

Bedakan juga konkurensi dari laju permintaan. Empat permintaan berumur panjang dan empat permintaan sangat pendek menggunakan jatah konkurensi yang sama sambil menghasilkan laju permintaan per detik yang berbeda. Layanan dengan kebijakan laju mungkin memerlukan pengaturan tempo atau pembatas laju terpisah.

Pilih pengenal proxy yang stabil dan tidak rahasia untuk log dan metrik. Jika dua URL yang membawa kredensial merujuk ke kumpulan kapasitas yang sama, putuskan apakah keduanya harus berbagi satu anggaran. Sebaliknya, port atau akun berbeda dapat mewakili batas terpisah ketika operator mendokumentasikannya demikian.

Ketika throughput turun, periksa di mana pekerjaan menunggu: semafor Anda, konektor, penyiapan koneksi proxy, atau pembacaan respons. Menaikkan semua batas sekaligus membuat perbedaan itu lebih sulit dan dapat memindahkan antrean ke proxy yang tidak Anda kendalikan.

Artikel terkait