TGViewer
Бессонный кодер Бессонный кодер @sleeplesscode · 4.24K subscribers
Post #445 3.7K
Бессонный кодер Как поспали? Надеюсь, хорошо! А вот наша команда и серверы с компами ХРЕНАЧИЛИ всю ночь! А ещё я наконец начал окунаться в невероятно интересный мир highload-распределённых вычислений, но обо всём по порядку. Вы уже не раз слышали о нашей системе контентной…
Помните эту историю? Ждали продолжение? А вот и оно.

Как я ускорил обработку файлов во много раз


Я окончательно понял: настало время менять подход. Пора писать отдельный сервер, который будет работать с нашим текущим протоколом, но использовать все мощности.

Чтобы понять, что изменилось, давайте рассмотрим старый алгоритм:

1️⃣ Воркер подключается к серверу по WebSocket и авторизуется под своим токеном. (Это защищает файлы от кражи и позволяет учитывать бонусы модераторов.)
2️⃣ После успешной авторизации воркер запрашивает задачу. Если задач нет, он ждёт 1 минуту и повторяет запрос. Если задача есть, сервер загружает файл из Telegram и отдаёт его воркеру.
3️⃣ Воркер обрабатывает файл, классифицирует его по таблице NSFW и отправляет результат на сервер. Контроллер проверяет данные и начисляет бонусы.

Где была проблема?

Задачи скачивались в момент запроса воркера. А воркеров много! Для каждого приходилось делать запрос к базе и загружать файл с Telegram.
Итог: CPU и Load Average в сотку, а обработка одного файла занимала 30-40 секунд.

Как я решил проблему?

🔥 Батчинг работы с БД – вместо тысячи мелких запросов теперь запрашиваю большой пул задач, которые потом раздаются воркерам.
🔥 Предварительная загрузка – заранее подкачиваю файлы в балансирующий буфер, чтобы воркеры не ждали.
🔥 Отдельный сервер – вынес контроллер загрузки на отдельную машину, разгрузив БД и основной сервер.
🔥 Параллельная загрузка – Telegram иногда «тупит» и держит запрос по 5-20 секунд, поэтому теперь одновременно отправляется 25 запросов.

Результаты оптимизации:

23:03
Files in queue: 1 922 795
Buffer: 500/1000 (50.0%) | Workers: 10
Я: Написал реле, щас постестим
Я: Попробуй поменять адрес сервера у воркеров на [REDACTED]
Я: Не сказать что буффер там успевает накачиваться, но хоть пытается
Я: Уже 500(прим. автора - имеется в виду количество файлов) в кеше


23:18
Files in queue: 1 907 795
Buffer: 401/1000 (40.1%) | Workers: 27
Модератор: 1к за 2 минут (прим. автора - модератор имеет в виду что его воркеры обработали 1к файлов за 2 минуты)
Я: *****
Я: БУФФЕР СТАЛ РАСТИ


Тут координатор нашёл баланс и начал накапливать файлы для отдачи воркерам, позволяя выдавать им задачи за минимальный срок.

23:22
Files in queue: 1903795
Buffer: 908/1000 (90.8%) | Workers: 27
Я: Щас как понимаю основная статья ожидания, сетевые расходы?
Модератор: Уже нет, ты отдаёшь и принимаешь стикеры в среднем за 0.3 секунд
Модератор: Поздравляю Илья, ты смог оптимизировать это настолько что теперь мой процессор забит на 100 процентов)
Я: ***** ТЫ ТАМ РАЗОГНАЛСЯ
Модератор: СКОЛЬКО
Модератор: Я подрубил вторую видюху, пришлось немного переписать твой код, сейчас смотрю насколько поможет
Я: Я увидел 38 воркеров онлайн Щас 31


Тут мы перешли в наблюдение, будет ли оно дальше жить и на что нам надеятся.

23:43
Files in queue: 1887243


00:18
Files in queue: 1854381


Верно очередь шла вниз, но мне хотелось быстрее, поэтому я начал эксперименты.

00:30
Files in queue: 1 843 115
Я: @(тег модератора) ты механизм переподключения не убирал?
Модератор: Нет, А что
Я: ага, хочу чуть обновить реле инфографикой
Я: в момент рестартнется скоро
Модератор: Окей


Но обновил я его не только инфографикой, но и другим балансом настроек скачивания, что по моей теории должно было ускорить работу...

#downTime
  • 🔥 57
  • ❤ 8
  • 👍 6
  • 🫡 4
  • 😎 3
  • ❤‍🔥 2
  • 💘 1
More from @sleeplesscode
  1. Oct 5, 2026Post #923
  2. Oct 1, 2026Post #914
  3. Sep 18, 2026Post #913
  4. Sep 17, 2026Post #912
  5. Sep 15, 2026Post #911
  6. Sep 14, 2026Post #909
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →