Ограничение на количество новых соединений (2019)

Что происходит

24 сентября «Дадата» начнёт использовать новую систему защиты от сетевых атак. В числе прочих мер, она запрещает создавать более 60 новых сетевых соединений в минуту.

Что это вообще значит

Когда ваша программа обращается к «Дадате», она создаёт сетевое соединение. Обычно программы не создают всё новые и новые соединения, а используют ограниченное количество уже созданных. У этого подхода есть разные названия — HTTP persistent connection, keepalive, «пул соединений» — но суть одна и та же: программа переиспользует сетевые соединения, а не создаёт новые на каждый запрос.

Создание большого количества сетевых соединений — типичное поведение злоумышленников, которые атакуют облачные сервисы. Поэтому система защиты «Дадаты» будет следить, чтобы количество новых соединений с каждого IP-адреса не превышало 60 в минуту.

Новое ограничение никак не связано с количеством запросов в секунду. Представим две ситуации:

  1. Программа выполняет 20 запросов в секунду, используя всего одно соединение.
  2. Программа выполняет 100 запросов в минуту, создавая новое соединение на каждый запрос.

У первой программы не возникнет проблем с новым ограничением, несмотря на большое количество запросов. А у второй — возникнет.

Как это отразится на вас

Если ваши пользователи работают через браузер, и вы не проксируете запросы к «Дадате» через свой сервер — никак не отразится, дальше можно не читать.

Если работаете через API, и ваша программа переиспользует сетевые соединения — изменение тоже пройдёт незамеченным. Повторное использование сетевых соединений считается хорошим тоном среди разработчиков. Большинство платформ (Java, .NET, Python) используют его по умолчанию. С большой вероятностью, ваша интеграция работает так же, поэтому ничего делать не придётся.

Но если ваша программа создаёт отдельное сетевое соединение на каждый запрос (чаще всего этим «грешат» программы на PHP), и вы делаете более 60 запросов в минуту — интеграция перестанет нормально работать.

Как понять, нужно ли вам что-то делать

Временно перенаправьте работающую интеграцию на сервер «Дадаты», который уже использует новую систему защиты. Для этого на сервере, с которого идут запросы к «Дадате», добавьте в hosts-файл такие записи:

186.2.163.83    dadata.ru
186.2.163.83    suggestions.dadata.ru

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

Не забудьте после проверки удалить записи в hosts-файле.

Как изменить программу, чтобы она не создавала новые соединения

Если используете PHP — посмотрите наши примеры для подсказок и стандартизации. В них написано, как повторно использовать сетевые соединения.

Если работаете с другим языком программирования — почитайте документацию библиотеки, которую используете для работы с HTTP. Там точно это есть.

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

Что делать, если вы не готовы менять программу

Мы понимаем, что изменения, особенно в крупных компаниях — дело небыстрое. Поэтому пользователям платных тарифов готовы временно предоставить отдельный сервер, на котором ограничение будет отключено. Если:

  • вы убедились, что интеграция не работает нормально с новой «Дадатой»,
  • вы не готовы исправить программу до 24 сентября,
  • у вас платный тариф,

— напишите нам, и мы предложим обходное решение.

Обходное решение будет работать ещё год, до 24 сентября 2020 года.

В любом случае, лучше как можно быстрее перейти на повторное использование сетевых соединений — это в целом более надёжный, быстрый и правильный способ работы.