Розробка мобільного додатку для соціальної мережі
Соціальна мережа — один із найтехнічно навантажених типів мобільних додатків. Лента контенту з алгоритмічною сортуванням, real-time уведомлення, медіазавантаження, пошук людей, граф зв'язків — кожна з цих функцій потребує окремого продуманого підходу. Масштабування, яке працює при 1000 користувачах, ламається при 100 000.
Лента контенту: головне архітектурне питання
Лента в Instagram, TikTok, Twitter — це не просто «запит до БД, сортування за датою». Це персоналізована видача на основі графа зв'язків, історії взаємодій та engagement-сигналів.
На старті — хронологічна лента з pagination на основі курсору: GET /feed?cursor=<timestamp>&limit=20. Курсор замість offset — тому що при додаванні нових постів offset-пагінація пропускає елементи. Курсор — закодовані created_at + id.
Алгоритмічна лента — складніше: ранжування на основі ваг (час публікації, лайки за перші 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 + локальна синхронізація стану. FCM/APNs для пробудження, додаток при старті запитує дельту змін. Найбільш дружній до батареї підхід для мобільних.
Граф зв'язків та пошук людей
Граф «кто на кого підписаний» — погано розміщується в реляційній БД при мільйонах користувачів. MVP: таблиця follows (follower_id, following_id) в PostgreSQL з індексами — працює до сотень тисяч користувачів. При зростанні — граф-БД (Neo4j) чи спеціалізовані рішення.
Пошук людей за іменем: Elasticsearch з match_phrase_prefix для автодоповнення, edge_ngrams для частникового пошуку. Фонетичний пошук — phonetic analyzer для нечіткого пошуку імен.
Рекомендації «кого підписатися» на старті: спільні підписники, користувачі з одного регіону/за контактами (ContactsFramework iOS, ContactsContract Android — з явним дозволом користувача).
Медіаконтент: завантаження та обробка
Завантаження фото/відео — завжди multipart з presigned URL на S3/object storage. Ніколи не через backend як прокси: зайве навантаження на сервер. Клієнт отримує presigned URL → завантажує прямо до сховища → відправляє підтвердження на backend.
Обробка відео: transcoding в кілька якостей (360p, 720p, 1080p) через AWS MediaConvert, Cloudflare Stream чи самостійний FFmpeg. Thumbnail з першого кадру. HLS вихід для адаптивного стримінгу.
На мобільних перед завантаженням — компресія: UIGraphicsImageRenderer для фото (цільовий розмір + якість JPEG), AVAssetExportSession з AVAssetExportPresetMediumQuality для відео. Без цього користувачі з iPhone Pro Max завантажують 50+ МБ на пост.
Модерація контенту
Автомодерація — обов'язкова з першого дня: Google Cloud Vision Safe Search, AWS Rekognition чи PhotoDNA для детектування CSAM. Для користувацького тексту — моделі класифікації через OpenAI Moderation API чи open-source (Google's Perspective API).
На iOS: дозвіл PHPhotoLibrary readWrite при завантаженні з галереї, Android — READ_MEDIA_IMAGES / READ_MEDIA_VIDEO (Android 13+).
Приватність та compliance
GDPR: право на видалення, експорт даних. Технічно: м'яке видалення з флагом + scheduled job для фізичного видалення через 30 днів. Архівування медіа в холодне сховище.
Графіки
MVP з лентою, профілями, підписками та лайками: 8–12 тижнів. Повнофункціональна соціальна мережа з медіа, пошуком, історіями та модерацією: 4–8 місяців. Вартість розраховується індивідуально після аналізу вимог.







