Разработка мобильного приложения для социальной сети
Социальная сеть — один из самых технически нагруженных типов мобильных приложений. Лента контента с алгоритмической сортировкой, real-time уведомления, медиазагрузка, поиск людей, граф связей — каждая из этих функций требует отдельного продуманного подхода. Масштабирование, которое работает при 1000 пользователях, ломается при 100 000.
Лента контента: главный архитектурный вопрос
Лента в Instagram, TikTok, Twitter — это не просто «запрос к БД, отсортировать по дате». Это персонализированная выдача на основе графа связей, истории взаимодействий и engagement-сигналов.
На старте — хронологическая лента с пагинацией cursor-based: GET /feed?cursor=<timestamp>&limit=20. Cursor-based пагинация вместо offset-based — потому что при добавлении новых постов offset-пагинация пропускает элементы. Cursor — created_at + id в encoded виде.
Алгоритмическая лента — сложнее: нужно ранжирование на основе весов (время публикации, количество лайков за первые N минут, engagement автора, близость в графе). На первых порах — простые эвристики, считаемые на бэкенде, с кэшированием в Redis. Разработка полноценного ML-ранжирования — отдельный проект.
Fan-out стратегия. Когда пользователь с 50 000 подписчиков публикует пост — нельзя записать 50 000 строк в лент-таблицы синхронно. Стандартный подход: fan-out on write (запись в очередь для каждого подписчика через message queue — Kafka/RabbitMQ), fan-out on read (формировать ленту в момент запроса из постов тех, на кого подписан). Гибрид: обычные пользователи — fan-out on write, «звёзды» — on read.
Real-time: уведомления и активность
Активность в социальной сети требует real-time обновлений: лайк на пост, новый подписчик, ответ на комментарий. Подходы:
- Long polling — устарело, создаёт лишнюю нагрузку.
-
WebSocket — подходит для чата и real-time ленты активности. На iOS:
URLSessionWebSocketTask, на Android: OkHttpWebSocket. Проблема: мобильные устройства убивают соединение при переходе в фоновый режим. -
Firebase Realtime Database / Firestore — готовое решение с offline persistence. Firestore
addSnapshotListener— live обновления из коробки. Подходит для MVP, при масштабировании требует архитектурного пересмотра. - Push + local state merge. FCM/APNs для wake-up, приложение при старте запрашивает дельту изменений. Самый battery-friendly подход для мобильных.
Граф связей и поиск людей
Граф «кто на кого подписан» — это данные, которые плохо лежат в реляционной БД при миллионах пользователей. Для MVP: таблица follows (follower_id, following_id) в PostgreSQL с индексами — работает до сотен тысяч пользователей. При росте — граф-БД (Neo4j) или специализированные решения (Twitter's FlockDB, Meta's TAO).
Поиск людей по имени: Elasticsearch с match_phrase_prefix для autocomplete, edge_ngrams для поиска по части имени. Фонетический поиск — phonetic analyzer для нечёткого поиска имён с опечатками.
Рекомендации «кого подписаться» на старте: общие подписчики (mutual friends), пользователи из одного региона/по контактам телефонной книги (ContactsFramework iOS, ContactsContract Android — с явным разрешением пользователя).
Медиаконтент: загрузка и обработка
Загрузка фото/видео — всегда multipart upload с presigned URL на S3/Yandex Object Storage. Никогда не через backend как прокси: это создаёт ненужную нагрузку на сервер. Клиент получает presigned URL → загружает напрямую в хранилище → отправляет confirmation на backend.
Обработка видео: transcoding в несколько качеств (360p, 720p, 1080p) через AWS MediaConvert, Cloudflare Stream или FFmpeg на собственном сервере. Thumbnail из первого кадра. HLS output для адаптивного стриминга.
На мобильных перед загрузкой — компрессия: UIGraphicsImageRenderer для фото (target size + качество JPEG), AVAssetExportSession с AVAssetExportPresetMediumQuality для видео. Без этого пользователи с iPhone Pro Max загружают 50 МБ на пост.
Модерация контента
Автомодерация — обязательна с первого дня: Google Cloud Vision Safe Search, AWS Rekognition или PhotoDNA для детектирования CSAM. Для пользовательского текста — модели классификации через OpenAI Moderation API или open-source (Perspective API от Google).
На iOS: PHPhotoLibrary разрешение readWrite при загрузке из галереи, на Android — READ_MEDIA_IMAGES / READ_MEDIA_VIDEO (Android 13+).
Приватность и соответствие требованиям
GDPR: право на удаление данных, экспорт данных пользователя. Техническая реализация: мягкое удаление с флагом + scheduled job для физического удаления через 30 дней. Архивирование медиа в холодное хранилище.
Сроки
MVP с лентой, профилями, подписками и лайками: 8–12 недель. Полноценная социальная сеть с медиа, поиском, историями и модерацией: 4–8 месяцев. Стоимость рассчитывается индивидуально после анализа требований.







