Оновлення

Ratingo: чому ми переписали все з нуля

Ratingo починався дуже просто.

Я навайбкодив MVP на Next.js, де фронтенд і бекенд були фактично одним цілим. Це був швидкий експеримент — перевірити, чи взагалі ідея сервісу, який підказує, що подивитись, цікава комусь ще, окрім мене. Бо на старті Ratingo був суто особистим проєктом: я робив його для себе, він працював тільки локально і не замислювався як щось публічне

І, як виявилось — потрібна.

Про Ratingo написали українські техно-медіа: ITC, dev.ua та ще кілька інших. Після публікацій на сайт почали заходити люди — не десятки, а тисячі гостей одночасно, щоб подивитися, що це за сервіс.

І тут сталося те, що мало статися 🙂

Проєкт із самого початку будувався як локальний. Він крутився на k3s-кластері з 4 Raspberry Pi, які чесно тягнули бек, фронт і “будували повістку дня”: які серіали зараз варто дивитися, що виходить, що в тренді.

Але після публікацій усе просто… лягло.

По-перше, залізо не витягнуло. Довелося терміново переїжджати в хмару — на Railway.

По-друге (і це було болючіше), я дуже чітко побачив, наскільки погано був написаний бекенд.

Деякі запити відповідали по кілька секунд, логіка була розмазана між клієнтом і сервером, масштабування — майже нереальне.

image

Паралельно почали приходити люди з ідеями, фідбеком і покращеннями.

І один із найчастіших запитів був простий і логічний:

А буде мобільний додаток?

І саме в цей момент стало очевидно:

Ratingo треба переписувати з нуля.

Що я зробив

У якийсь момент я зрозумів, що проблема не лише в архітектурі клієнтів і бекенду. Вона була глибша: у Ratingo не існувало єдиного місця, де були б зібрані й послідовно застосовані всі правила роботи з контентом.

Тому я заклав в основу системи policy engine — окреме ядро правил. Він не “вирішує”, що користувачу дивитись, а визначає умови й обмеження, за якими контент потрапляє в продукт і в якому вигляді.

Простою мовою, policy engine відповідає на питання:

  • що вважати релевантним контентом у конкретному контексті,

  • що відфільтрувати як шум або тимчасовий хайп,

  • які дані можна показувати новому користувачу,

  • як по-різному поводитись із серіалами, що щойно вийшли, і з тими, що давно завершені.

Важливо, що ці правила не захардкоджені у клієнтах і не розкидані по сервісах. Вони зібрані в одному місці, застосовуються однаково для всіх сценаріїв і можуть змінюватися чи розширюватися без переписування фронтенду.

Фактично, policy engine став єдиною точкою входу до даних у Ratingo.

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

Окремим великим шматком я переосмислив систему рейтингу. Бо дуже швидко стало зрозуміло: просто показувати IMDb або TMDB — цього недостатньо.

У Ratingo рейтинг — це не одне число, а результат формули, яка враховує кілька незалежних факторів.

По-перше, ми агрегуємо зовнішні рейтинги з різних джерел. Але не просто усереднюємо їх. Кожне джерело має свою “вагу”, а сам рейтинг коригується залежно від кількості голосів. Оцінка 9.0 з десяти голосів і 8.2 з десяти тисяч — це зовсім різні сигнали, і система це враховує.

По-друге, ми дивимось на рівень довіри до рейтингу. Якщо контент новий і голосів ще мало — рейтинг не вважається стабільним і не отримує максимального впливу на фінальний бал. Це дозволяє не переоцінювати гучні новинки в перші дні після релізу.

По-третє, у формулі є популярність і динаміка інтересу: скільки людей додають контент у списки, як швидко росте увага, чи це короткий хайп, чи стабільний інтерес у часі. Це не “якість”, але важливий контекст.

У результаті фінальний рейтинг — це не просто “наскільки добре”, а відповідь на складніше питання:

наскільки цьому контенту можна довіряти прямо зараз і кому він може підійти.

Саме тому Ratingo може показувати не лише число, а й контекст:

чому цей серіал зараз у топі, чому інший має високу оцінку, але не рекомендується всім, і чому деякі речі краще “відкласти на потім”.

Нова модель фонових процесів у Ratingo

Окремо я переосмислив й те, як у Ratingo виконуються фонові задачі.

У першій версії все було максимально прямолінійно: звичайні cron-джоби за розкладом стукались у ендпоінти. Але тепер запуск по часу — це лише сигнал, а не сама робота. Задача потрапляє в чергу, отримує свій контекст і правила виконання, а далі система чітко знає, коли вона стартувала, як відпрацювала і чим завершилась.

Це важливо для всього, що відбувається в Ratingo регулярно: оновлення рейтингів і трендів, синхронізація з зовнішніми джерелами, перерахунок політик і підготовка вітрин для клієнтів. Усі ці процеси тепер працюють передбачувано й масштабуються.

Що далі

Ratingo більше не MVP “на коліні”. І так — робота над ним ще триває. Це не фінальний продукт, але це вже інший рівень.

Дякую всім, хто прийшов, провів навантаження, залишив фідбек і змусив зробити Ratingo кращим ❤️