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
0
610
Один кликстрим на все бэкенды. Дмитрий Хасанов (Авито)
Внедрение инструментария для отправки аналитических событий в php, go, python
AvitoTech
April 28, 2018
Tweet
Share
More Decks by AvitoTech
See All by AvitoTech
«Масштабируемая архитектура фронтенда» — Роман Дворнов, Avito
avitotech
0
850
Атомарные SPA — Александр Китов, Альфа-Банк
avitotech
0
1.1k
Моделирование пользовательских предпочтений в мультимодальных данных. Hady W. Lauw, Максим Ткаченко (Singapore Management University)
avitotech
0
310
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
310
«(Не)Безопасность 101» — Григорий Джанелидзе, Mosdroid
avitotech
0
350
«CI процессы в Android разработке Avito», Сергей Пинчук, Avito
avitotech
0
330
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
55
Аналитическое хранилище Avito.ru — от больших к очень большим данным — Артем Данилов (Avito)
avitotech
1
4.4k
Кросс-продуктовые эффекты, или как мы оценивали вклад «Электричек» — Екатерина Лосева (Туту.ру)
avitotech
0
4.3k
Other Decks in Programming
See All in Programming
Rails と人魚の話/rails-and-mermaid
sanfrecce_osaka
0
100
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
190
Java 22 Overview
kishida
1
180
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
860
Designing for tomorrow's programming workflows
honnibal
PRO
2
120
Goのエラースタックトレースの歴史と今後
sonatard
6
600
スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた / Re-reading the Sprint Retrospective Section in the Scrum Guide
mackey0225
3
400
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
220
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Zero Waste, Radical Magic, and Italian Graft – Quarkus Efficiency Secrets
hollycummins
0
230
Ruby Function Composition
bkuhlmann
1
330
コードレビューで学ぶ!Kotlinオブジェクト指向デザインパターン
akkie76
2
190
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
120
16k
Build The Right Thing And Hit Your Dates
maggiecrowley
23
2k
The Power of CSS Pseudo Elements
geoffreycrofte
59
5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
77
42k
Designing with Data
zakiwarfel
95
4.8k
Designing for Performance
lara
601
67k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
273
13k
GraphQLの誤解/rethinking-graphql
sonatard
50
9.2k
GitHub's CSS Performance
jonrohan
1024
450k
Building a Scalable Design System with Sketch
lauravandoore
455
32k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
18
1.7k
Why Our Code Smells
bkeepers
PRO
331
56k
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