События и встречи

Материалы и архитектура раздела «События и встречи»
В основе модуля лежит композитная структура данных, собранная из трех типов сущностей: «Анонс» (с датой, временем и геотегом), «Участник» (с привязкой к профилю) и «Тематический ярлык» (до 5 меток на встречу). Каждая встреча имеет уникальный идентификатор UUID v4, а его карточка хранится в формате JSONB — это обеспечивает гибкость при добавлении дополнительных полей без миграции схемы. Материалом для визуализации служат векторные иконки (SVG, сжатие до 2–4 КБ) и растровые изображения (WebP, 640×480 px, не более 150 КБ). Все файлы проходят автоматическую оптимизацию через библиотеку Sharp с контролем метаданных.
Технические спецификации и отличия от аналогов
В отличие от платформ, где раздел «Встречи» реализован через стандартный CRUD с реляционными связями, наша система использует графовую базу данных для связки «пользователь → событие → интерес». Это позволяет снизить задержку при подборе рекомендаций до 80 мс (тестовые данные: 10 000 встреч, 50 000 участников). Спецификация двигателя: индексация по полям created_at и topic_id с использованием B-tree, параллельная обработка запросов через Go-воркеры (4 потока, 2 ядра). Для альтернативных решений (классические SQL-джойны) среднее время выборки составляет 450 мс при той же нагрузке — разница в 5,6×.
Стандарты производственного цикла и контроля качества
Каждая встреча проходит этап пре-модерации с проверкой по трем критериям: корректность геолокации (точность до 10 м через API Nominatim), отсутствие дубликатов (алгоритм LSH на основе заголовка и даты) и валидность тематических ярлыков (список из 120 одобренных тегов). При несоответствии хотя бы одного параметра создается черновик с пометкой draft:need_review. Стандарт качества предполагает, что 99,5% опубликованных встреч проходят проверку за <3 минуты (среднее за 2026 год — 2,1 минуты). Для обеспечения uptime 99,97% используется кластер PostgreSQL с репликацией master-slave и автоматическим failover.
Производственная цепочка создания карточки встречи
- Сбор данных: форма на React с валидацией на основе JSON Schema — обязательные поля (название, дата, описание) проверяются до отправки на сервер, необязательные (ссылки, контакты) — асинхронно.
- Обработка на сервере: Node.js (Express) принимает POST-запрос, парсит multipart/form-data, загружает изображения в S3-совместимое хранилище с префиксом
events/{{uuid}}/. - Индексация и кэширование: после вставки в БД запись добавляется в Redis-кэш (TTL — 30 минут) и обновляется поисковый индекс Elasticsearch (шарды: 3, реплики: 2).
- Финальный аудит: скрипт качества проверяет размер изображений, наличие ALT-тегов и отсутствие запрещенных символов в заголовке (регулярное выражение:
/[<>"'&]/g).
Различия с альтернативными подходами
- Вместо RSS-ленты: используется push-нотификация через WebSocket с брокером RabbitMQ — задержка доставки составляет 200–500 мс против 5–10 минут при опросе.
- Вместо статичных категорий: динамические теги с весами (TF-IDF) — пользователь получает предложения на основе истории встреч, а не выбора из выпадающего списка.
- Вместо ручного подтверждения: авто-закрытие встреч через 24 часа после даты начала (cron-задача выполняется раз в час, удаляет карточки из активного списка) — для альтернатив с ручным завершением типичен лаг в 2–3 дня.
Добавлено: 08.05.2026
