🖥 Как случайно сделать DDoS своим же кодом
Как случайно устроить DDoS самому себе - самый частый сценарий это когда ты запускаешь 1000 запросов параллельно и думаешь, что ускоряешься, а на деле убиваешь свой же сервис или сайт.
Что ломает всё быстрее всего:
Нет лимитов на конкурентность - корутины или потоки плодятся бесконечно
Нет пула соединений - каждый запрос создаёт новый коннект и душит сеть
Нет таймаутов - зависшие запросы копятся и съедают ресурсы
Нет ретраев с backoff - ты усиливаешь нагрузку, когда системе и так плохо
Нет rate limit - ты сам становишься источником перегруза
Правильная база - всегда ограничивай параллелизм семафором, используй один клиент с пулом, ставь таймауты и делай аккуратные ретраи.
import asyncio
import httpx
URLS = ["https://example.com"] * 500
async def fetch(client, sem, url):
async with sem: # лимит конкурентности
r = await client.get(url, timeout=10.0)
return r.status_code
async def main():
sem = asyncio.Semaphore(20) # не больше 20 запросов одновременно
limits = httpx.Limits(max_connections=50, max_keepalive_connections=20)
async with httpx.AsyncClient(limits=limits) as client: # пул соединений
tasks = [fetch(client, sem, u) for u in URLS]
results = await asyncio.gather(*tasks, return_exceptions=True)
print("done:", len(results))
asyncio.run(main())
@linuxkalii