Створення просторової пам'яті
Я витратив три місяці на створення «Pinterest для фізичного світу».
Ідея проста. Ви залишаєте цифрові нотатки, фотографії або історії за певними GPS-координатами. Люди можуть побачити їх лише тоді, коли фізично перебуватимуть саме в цьому місці. Це перетворює реальний світ на колекцію цифрових капсул часу.
Створення додатка на основі геолокації складніше, ніж здається. Ось що я дізнався про технологічний стек.
Просторова база даних
Якщо ви хочете масштабуватися, не можна просто зберігати широту та довготу як звичайні числа. Вам потрібні просторові індекси. Я використовував PostGIS із PostgreSQL.
Він забезпечує:
- Просторове індексування за допомогою R-tree
- Вбудовані розрахунки відстані
- Швидкі запити на близькість
Якщо вам потрібно знайти спогади в радіусі 50 метрів від користувача, PostGIS бере на себе основне навантаження.
Стратегія кешування
Популярні туристичні місця отримують занадто багато запитів. Звернення до бази даних кожні дві секунди погано впливає на продуктивність. Я використовував команди Redis GEO для кешування ID спогадів у людних місцях.
Порада професіонала: не кешуйте весь об'єкт у Redis. Кешуйте лише ID. Це дозволяє тримати споживання пам'яті на низькому рівні та скорочує час запиту з 20 мс до 2 мс.
Патерн завантаження
Якщо ваш сервер оброблятиме завантаження кожного фото, він впаде під навантаженням. Я використовував двофазний патерн завантаження:
- Клієнт запитує у сервера pre-signed URL
- Клієнт завантажує файл безпосередньо в Cloudflare R2
- Клієнт повідомляє серверу, коли завантаження завершено
Я обрав R2 замість S3, тому що там немає плати за вихідний трафік (egress fees). Це економить гроші, коли користувачі завантажують медіафайли.
Що спрацювало
- PostGIS та Redis GEO роблять просторові запити швидкими.
- Завантаження безпосередньо в R2 дозволяє бекенду масштабуватися.
- Go та Gin забезпечують високу продуктивність при низькому споживанні пам'яті.
- Прогресивна приватність (Private, Friends або Public) захищає користувачів.
Що пішло не так
- Точність GPS є нестабільною в містах із висотними будівлями.
- Проблема «холодного старту» реальна. Додатку потрібно багато користувачів, щоб він «ожив».
- Модерація контенту потребує постійної уваги.
Створення цього проєкту навчило мене тому, що фізичне розташування — це недооцінений вимір для соціальних додатків. Цифровий контент здається значущимшішим, коли він прив'язаний до реального місця.
Optional learning community: https://t.me/GyaanSetuAi
