Как мы собираем тарифы: история про диск на 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 не отдаёт вовсе или отдаёт данные, из которых каталог не собрать. Такие ведём вручную и сверяем регулярно. На странице методики видно, кто собирается автоматически, а кто нет.
Побочный эффект оказался полезнее основного: раз конвейер и так считает разницу в ценах, изменения складываются в отдельный журнал. Теперь на карточке тарифа видно, что цена недавно менялась, а история остаётся открытой — если провайдер нарисует скидку задним числом, это будет заметно.
Эта статья и на других площадках
- vc.ru — сокращённая версия; закрыта от индексации площадкой