Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Один кликстрим на все бэкенды. Дмитрий Хасанов ...
Search
AvitoTech
April 28, 2018
Programming
810
0
Share
Один кликстрим на все бэкенды. Дмитрий Хасанов (Авито)
Внедрение инструментария для отправки аналитических событий в php, go, python
AvitoTech
April 28, 2018
More Decks by AvitoTech
See All by AvitoTech
«Масштабируемая архитектура фронтенда» — Роман Дворнов, Avito
avitotech
0
1.3k
Атомарные SPA — Александр Китов, Альфа-Банк
avitotech
0
1.8k
Моделирование пользовательских предпочтений в мультимодальных данных. Hady W. Lauw, Максим Ткаченко (Singapore Management University)
avitotech
0
400
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
420
«(Не)Безопасность 101» — Григорий Джанелидзе, Mosdroid
avitotech
0
510
«CI процессы в Android разработке Avito», Сергей Пинчук, Avito
avitotech
0
460
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
120
Аналитическое хранилище Avito.ru — от больших к очень большим данным — Артем Данилов (Avito)
avitotech
1
4.8k
Кросс-продуктовые эффекты, или как мы оценивали вклад «Электричек» — Екатерина Лосева (Туту.ру)
avitotech
0
4.6k
Other Decks in Programming
See All in Programming
へんな働き方
yusukebe
6
2.9k
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
140
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
160
Goの型安全性で実現する複数プロダクトの権限管理
ishikawa_pro
2
1.4k
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
300
The free-lunch guide to idea circularity
hollycummins
0
400
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
3
440
飯MCP
yusukebe
0
450
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
8
4k
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.3k
KagglerがMixSeekを触ってみた
morim
0
360
AI Assistants for YourAngular Solutions @Angular Graz, March 2026
manfredsteyer
PRO
0
140
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
330
The Mindset for Success: Future Career Progression
greggifford
PRO
0
290
ラッコキーワード サービス紹介資料
rakko
1
2.8M
WENDY [Excerpt]
tessaabrams
9
37k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
260
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
260
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Transcript
Один кликстрим на все бэкенды Внедрение инструментария для отправки аналитических
событий в php, go, python Дмитрий Хасанов, Avito
Сервисная архитектура Avito облако CI/CD сервис демонок крончик 2
Общие задачи логи загрузка файлов метрики сервис демонок крончик 3
Кликстрим • клик • просмотр • оплата • сообщение в
мессенджере • поисковый запрос • рекламный аукцион 4
Готовые решения • Google Analytics • Яндекс Метрика 5
Кликстрим Событие Хранилище Отчёт 6
Кликстрим Событие Хранилище Отчёт 7
Кликстрим Событие Хранилище Отчёт “clickstream_event”: { “event_id”: 100, “user”: {
“id”: 413, “email”: “
[email protected]
” }, “geo”: { “latitude”: 20.220, “longitude”: -10.110 }, “user_agent”: “fluffy_browser”, “time”: “2018-04-11 22:37:05” } 8
Кликстрим Событие Хранилище Отчёт DWH 9
Простая реализация Проект A event = { ‘field_one’: ‘val_1’, ‘field_two’:
‘val_2’, ‘time’: unixtime() } transport.send(event) 10 Проект Б event = { ‘fieldOne’: ‘val_1’, ‘field.TWO’: ‘val_2’, ‘time’: date() } customTransport.send(event)
Простая реализация Плюсы: • быстро получаем отчёт • легко реализовать
Минусы: • бардак • затраты ресурсов • трудно переиспользовать код 11
Источники событий Бэкенды: • монолит: php • сервисы: go, python,
php • кроны, демоны: go, python, php, shell 12
Источники событий Бэкенды: • монолит: php • сервисы: go, python,
php • кроны, демоны: go, python, php, shell Фронтенды: js 13
Источники событий Бэкенды: • монолит: php • сервисы: go, python,
php • кроны, демоны: go, python, php, shell Фронтенды: js Мобильные приложения: swift, java 14
Источники событий Бэкенды: • монолит: php • сервисы: go, python,
php • кроны, демоны: go, python, php, shell Фронтенды: js Мобильные приложения: swift, java Внешние проекты: c#, java 15
Путь события сервис демонок крончик DWH транспорт 16
Путь события фронтенд сайта внешний проект мобильное приложение DWH транспорт
прокси 17
Реестр событий • окружения • события • поля • метаинформация
18
Кодогенерация • лангпак php, go, python • отправщик событий в
DWH • автодокументация 19
Лангпак • геттеры, сеттеры • общая логика 20 class EventOne:
def setFieldOne(string value): self.fields[“one”] = value def getFieldOne() -> string: return self.fields[“one”] def getTime() -> Timestamp: return time.now() def getData() -> EventData: return self.fields
Отправщик событий 21 сервис демонок крончик DWH транспорт
Пример лангпака package someproject type SomeEventV0 struct { *event }
func NewSomeEventV0() *SomeEventV0 { e := &SomeEventV0{ event: new( 420, `
[email protected]
`, `lindows`, ), } e.required["user_id"] = struct{}{} e.required["email"] = struct{}{} e.required["os"] = struct{}{} return e } 22
Версионирование событий • нельзя ломать код на бою • нельзя
удалять • новая версия события на каждое изменение 23
Версионирование лангпаков • нельзя ломать код на бою • новая
версия на каждое изменение кода лангпака 24
Получение лангпака • php composer install reestr/langpack • go, python
curl \ -d '{"environment":"bo"}' \ -H "Content-Type: application/json" \ http://reestr/langpack/go/0/ | tar x 25
Отправка событий • php $clickstreamSender->send($event); • go err := clickstreamSender.Send(event)
• python clickstream_sender.send(event) 26
Протохитрости 27 фронтенд сайта внешний проект мобильное приложение DWH транспорт
прокси
Протохитрости Мобильные приложения message MobileAppEvent { int32 eventId = 1;
int32 version = 2; int32 timestamp = 3; map<string,string> params = 4; } 28 Сторонние проекты message ExternalProjectEvent { int32 someIntField = 1; string someStringField = 2; bool someBoolFied = 3; }
Объекты event = { ‘scalar_field’: ‘some_string’, ‘object_field’: { ‘inner_scalar’: 3.14,
‘inner_object’: { … } } } 29 Плюсы: • наборы объектов Комплексность: • лангпаки • админка реестра • валидация
Административности • идентификация владельцев событий • отслеживание девиаций: технических, логических
• вывод из эксплуатации неиспользуемых событий • интеграция в работающие проекты 30
Настоящее • десятки источников • более тысячи версий событий •
логируется около двух миллиардов событий в сутки 31
Будущее • ускорение создания событий • нативные пакеты с лангпаками
для python и go • статус отправки события • доменная модель компонентов 32
Спасибо за внимание 33