Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Как собирать GPS треки раз в секунду экономя тр...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Andrew Minkin
November 08, 2016
Programming
66
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Как собирать GPS треки раз в секунду экономя трафик
Слайды с доклада на Highload++ 2016
Andrew Minkin
November 08, 2016
More Decks by Andrew Minkin
See All by Andrew Minkin
Рефакторинг монолита в микросервисы на Go
gen1us2k
0
150
Геоданные и Go
gen1us2k
0
66
Other Decks in Programming
See All in Programming
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
970
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
410
ActionController meets Protocol Buffers
sorah
0
550
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
720
AWSに止められる覚悟してますか?
morizo_1984
2
540
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
160
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
Evolving SEO for Evolving Search Engines
ryanjones
0
330
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
YesSQL, Process and Tooling at Scale
rocio
174
15k
30 Presentation Tips
portentint
PRO
1
430
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
Crafting Experiences
bethany
1
380
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
How to build a perfect <img>
jonoalderson
1
6.1k
Transcript
Собираем GPS-треки от водителей в такси раз в секунду, экономя
трафик Андрей Минкин MadDevs
Кто я • Team Lead/Maddevs.io • Nambataxi.kg • Nambafood.kg •
10 лет опыта(Sysadmin, Python/Go) • https://github.com/meshbird/meshbird • https://github.com/maddevsio/ariadna
Бишкек • 100+ служб такси • ~1M жителей
Namba taxi • 4 года на рынке • Не менее
8к заказов в сутки • 600+ водителей на линии • 500к+ довольных клиентов
Что такое такси • Клиенты • Водители • Операторы
AVG response time • Водители 20 ms • Операторы 2.5
ms
Предыстория
None
С чего мы начинали
Обновление местоположения • Водитель: раз в 15 секунд • Клиент:
раз в 15 секунд
А что еще происходит • Какой заказ сейчас выполняет •
Какой заказ будет следующим • Есть ли открытые тревоги
Первые пробы • Делаем запрос – сохраняем координаты • Делаем
запрос – анимируем машину
Первые проблемы • Машинку колбасит • Машинка едет по полям,
лесам
None
Решение • OSRM
Пробуем еще • Таймаут – 15 секунд • Делаем запрос
– сохраняем координаты • Шлем координаты • Делаем запрос в OSRM – выдаем маршрут в OSRM • Получаем маршрут – анимируем маркер
Проблемы • Одностороннее движение
None
Решение • Проверка на 20 метров
Релизнулись
None
Недочеты • Расчет стоимости – у водителя • 1 трек
в 15 секунд – мало • Проблемы с GPS у водителя
Проблемы с GPS • Плохой девайс изначально • GPS модуль
умирает со временем • Ямы и «глушилки»
Новые фичи • Хотим все это на главном экране
Вытекающие задачи • Собирать больше треков водителей • Показывать ближайшие
анимированные машины на главном экране • Хранить промежуточную стоимость на сервере • Экономить трафик водителю • Собирать трек раз в секунду
Расходы водителя за смену в Бишкеке • 550 р бензин
• 200 р еда • 200 р комиссия • Средний чек – 100р
Расходы на интернет • 100 р на водителя за смену
• 100 000 р в день.
Что такое трек и как он выглядит • Latitude •
Longitude • Session • OrderID • TripCost
Экономим трафик водителю • Уложить 1 трек в 100 байт
• И чтобы работало быстро
Огласите весь список, пожалуйста • HTTP • WebSockets • TCP
• UDP
Минусы http • Много хедеров • 18 байт оверхеда (GET
/ HTTP/1.0<CR><LF> <CR><LF>) • Работает поверх TCP
Минусы websocket • Работают поверх http • Нужно сделать upgrade
• На установление соединения 2 запроса • Нестабилен на плохом соединении
Минусы TCP
Минусы TCP • Долго • latency • Дорого • 20
байт на пакет
Почему UDP • Шлем только датаграммы • Гарантии не нужны
• Минимализм
Чем сериализировать? • JSON L • MsgPack L • Protocol
Buffers J
Размер данных 137 127 42 JSON MsgPack Protobuff
Итого • 42 байт пейлоада • + 20 байт IP
хедеров • = 62 байт на трек • = 2 мегабайта за смену • = 6 рублей в деньгах
Хранение
Какие данные хранить? • Сессия водителя • Номер борта •
ID заказа • Сумма поездки • Последнее местоположение • N последних точек
Что есть • Percona • Redis • Elasticsearch
Нужен геоиндекс • KD-tree • R-tree
Какие требования к геоиндексу • Поиск N ближайших точек •
Сбалансированное дерево
KD-Tree
Минусы KD-tree • Несбалансированное дерево • Поиск только одной ближайшей
точки
R-tree
Что не так с водителями • Плохая связь с интернетом
• Выключил телефон • Села батарейка • Выгрузил приложение из памяти • И еще полдесятка причин
• Нужен Expire • Нужен LRU для хранения координат
Как хранить • В памяти • R-tree • Карта с
водителями (ключ сессия) • Карта с водителями (ключ номер борта)
Какой алгоритм на бэкенде? • Получили пакет по UDP •
Получаем водителя со стораджа • Если нет – получаем с Redis • Проверяем, есть ли все нужные данные • Делаем set в сторадже
Какой алгоритм на бэкенде? • Если есть – обновляем •
Если нет – инициализируем LRU для координат • Обновляем инфу в R-tree
Варианты для реализации • Python • Ruby • Node.js •
Go
Go • Строго типизированный и компилируемый • Маленький размер docker-контейнеров
• Малый расход ресурсов • Меньше зоопарк
Как реализовывали • https://github.com/dhconnelly/rtreego • LRU – навелосипедили • UDP
– stdlib • https://github.com/golang/protobuf • HTTP API
HTTP API • Ближайшие водители • Удалить водителя (по номеру
борта или сессии) • Получить информацию о поездке • Получить маршрут по водителю
Куда интегрировать • Бэкенд для водителей • Бэкенд для клиентов
Как оно выглядит • Ядро – Django • Водители –
Twisted • Клиенты - Django
А архитектурно Nginx AppBackend Core Core AppBackend Core
Водители Nginx Twisted Core Core Twisted Core
Водители Водитель Location backend Core Twisted
Клиенты Клиент Location backend Core App backend
Как эксплуатировать • Логи в stdout • Метрики в Graphite
• Чеки в Sensu • Полезный /status • Боты
Полезный /status • Uptime since • HTTP Statuses counters •
Total requests
Боты • Эмуляция движения водителя • Эмуляция работы клиента
Как стало в мобильных приложениях • Получаем местоположение клиента •
Получаем ближайших водителей с маршрутом • Анимируем каждую машинку • Обновляем раз в 15 секунд
Сравнение результатов
None
None
None
Самый главный слайд • UDP+Protobuf для экономии трафика • In-memory
• R-tree для выдачи ближайших водителей • LRU cache для хранения последних координат • OSRM для выравнивания треков на дороге
Вопросы • https://github.com/maddevsio • https://github.com/gen1us2k • Skype: gen1us2k