5. Что такое события
{
"type": "web_timeline_page_loaded",
"timestamp": "2014-09-09T09:15:00Z",
"ip": "91.203.67.55",
"page_number": 1,
"timeline_type": "profile"
}
6. События
- Нажал на кнопку - событие отправилось
- У всех разная структура данных, трудно
выделить какую-то четкую схему
- Четыре основных клиента: Web сайт, Flash
Player, iOS и Android.
8. Зачем это нужно
- Самая честная статистика, с доступом к
сырым данным
- Для анализа и определения проблем
компании
- Для анализа поведения пользователей в
продуктах
9. Готовые решения
- Дорого на больших объемах (> 10K$)
- Нет доверия к алгоритмам подсчета
- Трудно работать с сырыми данными
- Быстро и просто
10. Пишем свое
- Непредсказуемый результат: вдруг
не заработает
- Неясные затраты
- Покрывает абсолютно все
возможные потребности в анализе
данных
11. Требования
- Сделать что-то быстро и просто
- Иметь возможность делать простые счетчики:
считать количество событий какого-то типа
- Делать примитивную аналитику (фильтры, distinct)
- Если ничего не выйдет - не страшно
14. Как хранятся данные
CREATE TABLE events_2014_04_18 (
type character varying(255),
datetime time without time zone,
data hstore
);
CREATE INDEX index_events_2014_04_18_on_type
ON events_2014_04_18 USING btree (type);
15. Старт эксплуатации
- От первой строчки до старта в
продакшн - 2 недели
- Идея рабочая, пользоваться можно
- Наконец появились требования и
понимание что не так
16. Проблемы
- Медленная аналитика (120-180
секунд на запрос)
- Ненадежно (одна машина,
ненадежный storage)
- Не масштабируемо (502, tcpconns,
etc)
17. Требования v2
- Данные важны - потерять нельзя ни в коем
случае
- Latency системы - не более 5 минут
- Анализировать так быстро, как можем
- Строить сложные группировки и нетипичные
отчеты
22. Frontend логика
- Добавляем ip, страну и всю meta
через GeoIP (MaxMind)
- Ставим куки
- ces_session_last_visit
- ces_session_visit_num
- ces_session_visit_page
- ces_seswion_total_pageviews
27. MongoDB
- Простая и понятная архитектура
- Сильное комьюнити, на любой вопрос
есть ответ
- Большой инструментарий для аналитики
- Не навязывает какую-то определенную
структуру данных
28. MongoDB: структура хранения
[
{
"type": "web_timeline_page_loaded",
"timestamp": "2014-09-09T09:15:00Z",
},
{
"type": “fp_player_started”,
"timestamp": "2014-09-10T09:15:00Z",
},
{
"type": "fp_player_finished",
"timestamp": "2014-09-10T09:15:00Z",
}
]
- Тормозит
пропорционально
количеству событий
- Каждый запрос -
аггрегация
29. MongoDB: структура хранения
{
"_id": {"$oid": "5408881ef7ca2f7995415b36"},
"event_type": "ios_editor_music_choosed",
"is_full": false,
"timestamp_minute": "2014-09-04T15:00:00Z",
"events": [{…},{…}],
“events_count": 2
}
30. MongoDB
- 101 тысяча документов за день.
- 3 млн в месяц
- Поминутное хранение событий
- Быстро делает примитивные
агрегаты
- upsert для загрузки
32. Железо, нагрузки
- 40 млн событий в день, 1.2 млрд в месяц
- 750-1250 новых событий в секунду
- ~8 млн объектов в коллекции
- 1 месяц ~ 600ГБ данных в Mongo
35. Юзкейсы и скорость работы
- Сколько у нас загрузок плеера в украине вчера?
- Интеграция аналитики в продукт
- Куда пошли пользователи из фейсбука,
попавшие на страницу коба?
- Как часто в неделю люди пользуются лентой?
36. Что плохо
- Когда данные не в памяти, все очень очень
медленно
- Не для всех отчетов такая структура данных
годится
- Mongo не может делать большие агрегаты в
памяти (16MB limit)
37. Команда и цена
- Backend: один я парттайм
- Разработчики клиентов (Android, iOS)
- 1100$ железо, трафик
- 300$/месяц Amazon S3
38. Планы
- Продуктовые Алерты
- Real Realtime
- Интеграция с Google Docs
- Больше отчетов и user friendly