Как мы собираем тарифы: история про диск на 10 терабайт за 590 рублей

Зачем агрегатору автоматический сбор цен, почему документация провайдеров почти никогда не совпадает с реальностью и как ошибка в единицах измерения чуть не уехала на витрину.

Почему вообще понадобилась автоматизация

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

Проблема была не в том, что вариантов мало. Их много. Проблема в том, что все сравнивалки устроены одинаково: слева фильтры по ядрам, памяти и диску, справа выдача. От вас ждут, что вы придёте уже со списком требований. А приходишь с задачей: сколько ядер нужно «чтобы не падало» — это как раз то, что и хочется выяснить.

Дальше второй круг. Открываешь три вкладки с тарифами и понимаешь, что сравнивать их между собой нельзя. У одного цена за месяц, у второго за год со скидкой, у третьего красивая цифра — первый месяц по акции. Где-то диск NVMe, где-то просто «SSD», а где-то прочерк и надо лезть в FAQ. И почти везде цены на агрегаторах отставали от реальных на сайте хостера.

Так появился SravniVPS — каталог, который сам ходит в API хостеров и следит, что у них поменялось.

10 240 мегабайт, которые чуть не стали гигабайтами

Один провайдер в каталоге отдаёт VPS с диском 10 ГБ за 590 рублей в месяц. Нормальная цена, ничего примечательного. Но на витрину чуть не уехал тот же самый тариф — с диском 10 терабайт. За те же 590 рублей.

Причина банальная. Поле с размером диска называлось так, будто в нём гигабайты, и документация это подтверждала. На самом деле там лежали мегабайты. Число 10 240 ушло в каталог гигабайтами вместо десяти. Лечится делением на 1024 — но сначала надо догадаться, что делить вообще нужно.

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

Документация почти никогда не совпадает с реальностью

У каждого API, с которым мы работали, нашлось минимум одно расхождение между тем, что написано в документации, и тем, что реально приходит в ответе. Не «неточность формулировки», а расхождение, на котором код молча делает не то.

У одного провайдера тип диска и объём видеопамяти не приходят отдельными полями вообще — их приходится доставать из текстового названия тарифа. У него же аккаунты на доменах .ru и .com оказались разными аккаунтами с разными токенами: запрос уходит, ответ приходит, всё «работает», данных нет.

Другой провайдер продаёт один и тот же тарифный план сразу в семи дата-центрах, и API честно отдаёт его семь раз подряд. Первая же синхронизация вывалила в каталог 160 записей вместо двух десятков уникальных конфигураций. Пришлось сравнивать тарифы не по названию, а по полному набору характеристик.

У третьего правильный регион нигде не задокументирован: запрос без региона падает с ошибкой, запрос с очевидным московским возвращает ровно ноль тарифов. Нашли перебором.

Что видно, когда данные наконец сходятся

В GPU-линейке одного провайдера обнаружились тарифы с одинаковым процессором и одинаковой памятью — 32 ядра и 256 гигабайт, — но с ценой 92 тысячи рублей и 260 тысяч. Разница почти втрое при идентичной строке характеристик.

Объяснение оказалось не в ошибке сбора: модель видеокарты и объём видеопамяти тоже были спрятаны текстом внутри названия тарифа. Именно они и определяют цену. Пока их не вытащишь в отдельные поля, сравнение выглядит абсурдом.

Это же касается доли процессорного ядра. Готовые конфигурации больших облаков нередко гарантируют лишь часть ядра — 10 или 50 процентов, — и в таблице характеристик это никак не отражено. Мы указываем долю прямо в названии тарифа.

Как это устроено сейчас

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

Часть провайдеров API не отдаёт вовсе или отдаёт данные, из которых каталог не собрать. Такие ведём вручную и сверяем регулярно. На странице методики видно, кто собирается автоматически, а кто нет.

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

как это устроеносбор данныхAPI

Эта статья и на других площадках

  • vc.ruсокращённая версия; закрыта от индексации площадкой

Сравнить тарифы VPS

Весь каталог с фильтрами и честной сортировкой — цены обновляются автоматически.

Открыть каталог →