Проєкти · професійна мережа та платформа вакансій
Профілі, навички й месенджер у реальному часі на одному індексі
Проблема
Професійній мережі потрібні три речі, які тягнуть у різні боки: профілі, достатньо багаті, щоб їх варто було шукати, пошук, достатньо швидкий, щоб відчуватися миттєвим, і обмін повідомленнями, достатньо негайний, щоб люди поверталися. Побудовані наївно, вони псують одне одне: багатші профілі сповільнюють пошук, а опитування нових повідомлень грузить ту саму базу, де працює пошук.
Підхід
Профілі людей і компаній моделюються окремо, але поділяють структури, за якими варто шукати, — експертиза, навички, сертифікати, мови, локація. Пошук працює проти Elasticsearch через шар документів, а не проти реляційних таблиць, тож нове поле в профілі не робить пошук повільнішим. Месенджер працює через власний канал реального часу на Redis замість опитування, а графи сповіщень і підписок пишуться асинхронно через Celery.
Що було технічно складним
Тримати індекс чесним. Як тільки пошук перестає читати базу, кожне редагування профілю, новий сертифікат і змінена компанія стають оновленням індексу, яке може впасти окремо, а учасник, невидимий для пошуку, фактично видалений із продукту. Індексація мала бути ідемпотентною й перезапускною з джерела істини, бо шлях відновлення — перебудувати індекс — це той, який справді використовують.
Одне рішення, і чому
Ми залишили реляційну схему єдиним джерелом істини, а індекс вважали похідним, одноразовим станом. Це коштує шляху перебудови, який треба підтримувати, але означає, що жодні дані не живуть лише в Elasticsearch, а пошкоджений індекс — це незручність, а не втрата.
Інші проєкти
- Звірка, що ловить розбіжність того ж дня →
Час виявлення розбіжності у звірці впав із тижнів до одного дня.
- Дані з машин приходять двічі, із запізненням або ніяк →
Підсумок кожної зміни тепер зводиться до власних показників цеху.
- Демографія для будь-якого контуру, який користувач може намалювати →
$ розкажіть, що ви будуєте і де застрягли
Забронювати 30-хв дзвінок
Відповідаємо протягом одного робочого дня.