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
820
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Один кликстрим на все бэкенды. Дмитрий Хасанов (Авито)
Внедрение инструментария для отправки аналитических событий в php, go, python
AvitoTech
April 28, 2018
More Decks by AvitoTech
See All by AvitoTech
«Масштабируемая архитектура фронтенда» — Роман Дворнов, Avito
avitotech
0
1.3k
Атомарные SPA — Александр Китов, Альфа-Банк
avitotech
0
1.9k
Моделирование пользовательских предпочтений в мультимодальных данных. Hady W. Lauw, Максим Ткаченко (Singapore Management University)
avitotech
0
410
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
430
«(Не)Безопасность 101» — Григорий Джанелидзе, Mosdroid
avitotech
0
530
«CI процессы в Android разработке Avito», Сергей Пинчук, Avito
avitotech
0
480
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
130
Аналитическое хранилище Avito.ru — от больших к очень большим данным — Артем Данилов (Avito)
avitotech
1
4.8k
Кросс-продуктовые эффекты, или как мы оценивали вклад «Электричек» — Екатерина Лосева (Туту.ру)
avitotech
0
4.6k
Other Decks in Programming
See All in Programming
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.3k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
210
共通化で考えるべきは、実装より公開する型だった
codeegg
0
210
自作OSでスライド発表する
uyuki234
1
3.8k
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
120
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
190
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
180
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
370
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.7k
Code Reviewing Like a Champion
maltzj
528
40k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Thoughts on Productivity
jonyablonski
76
5.2k
A Soul's Torment
seathinner
6
3.1k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
630
Scaling GitHub
holman
464
140k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
GitHub's CSS Performance
jonrohan
1033
470k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The Curious Case for Waylosing
cassininazir
1
430
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