Нельзя помочь всем — лимиты

На прошлой неделе облачный Bpium работал медленно в течение пары часов. Это случилось вечером, по этому мало кто мог это заметить. В этой статье мы расскажем что случилось, как мы решали проблему и что сделали, чтобы проблема не повторилась.

khaus_ups

Проблема

Проблема оказалась проста: одна из компаний активно «бомбила» сервера Бипиума некорректными запросами, тем самым тормозя запросы от других компаний. Каждый запрос использовал базовую авторизацию, которая занимает около 200мс на 100 000 операций шифрования. Эту искусственную математическую задержку ранее мы ввели намеренно, как защиту от перебора паролей. И она нам сыграла злую шутку.

Более того, эти запросы были некорректные, на что не были рассчитаны скрипты стороннего разработчика и зациклились. При этом каждый запрос проходил множество проверок через политику прав доступа, так как авторизация была успешной.

 

Решение

Чтобы быстро решить проблему, мы выделили этот домен на отдельный сервер. Задержки в работе других компаний прошли.

А чтобы избежать похожих проблем в будущем, ввели оптимизации и ограничения:

  • Кеширование успешных авторизаций. Это убирает избыточную нагрузку от работы сторонних систем через API без использования авторизационных куков.
  • Лимитирование неуспешных авторизаций. Каждая неуспешная попытка логорифмичечки увеличивает время до возможной следующей: 3 попытки — задержка 3 секунды, 5 попыток — уже 30 секунд, 8 попыток — 4 минут. Максимум 5 минут.
  • Лимитирование запросов от учетной записи. Бипиум разрешает 100 запросов в API за каждые 30 секунд. При превышении — ошибка 429 «Too many requests».
  • Лимитирование запросов с одного IP-адреса. Бипиум разрешает 1000 запросов в API за каждые 30 секунд. При превышении — ошибка 429 «Too many requests».

Эти ограничения должны помочь избежать подобных ситуаций в будущем.

 

Просим прощения за полтора часа медленной работы.

nu_izvini_pozhaluysta

Поделиться
Плюсануть

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>