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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
AvitoTech
April 28, 2018
Programming
820
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.9k
Моделирование пользовательских предпочтений в мультимодальных данных. Hady W. Lauw, Максим Ткаченко (Singapore Management University)
avitotech
0
400
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
430
«(Не)Безопасность 101» — Григорий Джанелидзе, Mosdroid
avitotech
0
520
«CI процессы в Android разработке Avito», Сергей Пинчук, Avito
avitotech
0
470
Кластеризация волатильных объявлений с помощью EM-алгоритма — Василий Лексин (Avito)
avitotech
0
120
Аналитическое хранилище Avito.ru — от больших к очень большим данным — Артем Данилов (Avito)
avitotech
1
4.8k
Кросс-продуктовые эффекты, или как мы оценивали вклад «Электричек» — Екатерина Лосева (Туту.ру)
avitotech
0
4.6k
Other Decks in Programming
See All in Programming
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
petamoriken
5
1.1k
ハーネスエンジニアリングとは?
kinopeee
13
6.8k
Spec Driven Development | AI Summit Vilnius
danielsogl
PRO
1
140
GitHubCopilotCLIをはじめよう.pdf
htkym
0
330
サークル参加から学ぶ、小さな事業の回し方
yuzneri
0
150
ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜
shimomura
0
110
PicoRuby for IoT: Connecting to the Cloud with MQTT
yuuu
2
770
PHPでバイナリをパースして理解するASN.1
muno92
PRO
0
430
〜バイブコーディングを超えて〜 チームで実験し続けたAI駆動開発
tigertora7571
0
200
Cache-moi si tu peux : patterns et pièges du cache en production - Devoxx France 2026 - Conférence
slecache
0
340
The Less-Told Story of Socket Timeouts
coe401_
3
1.1k
(Re)make Regexp in Ruby: Democratizing internals for the JIT
makenowjust
3
1k
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
130
The SEO Collaboration Effect
kristinabergwall1
1
440
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
390
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
180
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
170
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
740
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.4k
So, you think you're a good person
axbom
PRO
2
2k
Evolving SEO for Evolving Search Engines
ryanjones
0
190
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