71
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик Андрей Минкин MadDevs

Как собирать gps треки раз в секунду, экономя траффик

Embed Size (px)

Citation preview

Page 1: Как собирать gps треки раз в секунду, экономя траффик

Собираем GPS-треки от водителей в такси раз в секунду, экономя трафикАндрей Минкин MadDevs

Page 2: Как собирать gps треки раз в секунду, экономя траффик

Кто я• Team Lead/Maddevs.io• Nambataxi.kg

• Nambafood.kg

• 10 лет опыта(Sysadmin, Python/Go)

• https://github.com/meshbird/meshbird

• https://github.com/maddevsio/ariadna

Page 3: Как собирать gps треки раз в секунду, экономя траффик

Бишкек• 100+ служб такси

• ~1M жителей

Page 4: Как собирать gps треки раз в секунду, экономя траффик

Namba taxi• 4 года на рынке

• Не менее 8к заказов в сутки

• 600+ водителей на линии

• 500к+ довольных клиентов

Page 5: Как собирать gps треки раз в секунду, экономя траффик

Что такое такси• Клиенты

• Водители

• Операторы

Page 6: Как собирать gps треки раз в секунду, экономя траффик

AVG response time• Водители 20 ms

• Операторы 2.5 ms

Page 7: Как собирать gps треки раз в секунду, экономя траффик

Предыстория

Page 8: Как собирать gps треки раз в секунду, экономя траффик
Page 9: Как собирать gps треки раз в секунду, экономя траффик

С чего мы начинали

Page 10: Как собирать gps треки раз в секунду, экономя траффик

Обновление местоположения• Водитель: раз в 15 секунд

• Клиент: раз в 15 секунд

Page 11: Как собирать gps треки раз в секунду, экономя траффик

А что еще происходит• Какой заказ сейчас выполняет

• Какой заказ будет следующим

• Есть ли открытые тревоги

Page 12: Как собирать gps треки раз в секунду, экономя траффик

Первые пробы• Делаем запрос – сохраняем координаты

• Делаем запрос – анимируем машину

Page 13: Как собирать gps треки раз в секунду, экономя траффик

Первые проблемы•Машинку колбасит

•Машинка едет по полям, лесам

Page 14: Как собирать gps треки раз в секунду, экономя траффик
Page 15: Как собирать gps треки раз в секунду, экономя траффик

Решение• OSRM

Page 16: Как собирать gps треки раз в секунду, экономя траффик

Пробуем еще• Таймаут – 15 секунд

• Делаем запрос – сохраняем координаты

•Шлем координаты

• Делаем запрос в OSRM – выдаем маршрут в OSRM

• Получаем маршрут – анимируем маркер

Page 17: Как собирать gps треки раз в секунду, экономя траффик

Проблемы• Одностороннее движение

Page 18: Как собирать gps треки раз в секунду, экономя траффик
Page 19: Как собирать gps треки раз в секунду, экономя траффик

Решение• Проверка на 20 метров

Page 20: Как собирать gps треки раз в секунду, экономя траффик

Релизнулись

Page 21: Как собирать gps треки раз в секунду, экономя траффик
Page 22: Как собирать gps треки раз в секунду, экономя траффик

Недочеты• Расчет стоимости – у водителя

• 1 трек в 15 секунд – мало

• Проблемы с GPS у водителя

Page 23: Как собирать gps треки раз в секунду, экономя траффик

Проблемы с GPS• Плохой девайс изначально

• GPS модуль умирает со временем

• Ямы и «глушилки»

Page 24: Как собирать gps треки раз в секунду, экономя траффик

Новые фичи• Хотим все это на главном экране

Page 25: Как собирать gps треки раз в секунду, экономя траффик

Вытекающие задачи• Собирать больше треков водителей

• Показывать ближайшие анимированные машины на главном экране

• Хранить промежуточную стоимость на сервере

• Экономить трафик водителю

• Собирать трек раз в секунду

Page 26: Как собирать gps треки раз в секунду, экономя траффик

Расходы водителя за смену в Бишкеке• 550 р бензин

• 200 р еда

• 200 р комиссия

• Средний чек – 100р

Page 27: Как собирать gps треки раз в секунду, экономя траффик

Расходы на интернет• 100 р на водителя за смену

• 100 000 р в день.

Page 28: Как собирать gps треки раз в секунду, экономя траффик

Что такое трек и как он выглядит• Latitude

• Longitude

• Session

• OrderID

• TripCost

Page 29: Как собирать gps треки раз в секунду, экономя траффик

Экономим трафик водителю• Уложить 1 трек в 100 байт

• И чтобы работало быстро

Page 30: Как собирать gps треки раз в секунду, экономя траффик

Огласите весь список, пожалуйста• HTTP

•WebSockets

• TCP

• UDP

Page 31: Как собирать gps треки раз в секунду, экономя траффик

Минусы http•Много хедеров

• 18 байт оверхеда (GET / HTTP/1.0<CR><LF> <CR><LF>)

• Работает поверх TCP

Page 32: Как собирать gps треки раз в секунду, экономя траффик

Минусы websocket• Работают поверх http

• Нужно сделать upgrade

• На установление соединения 2 запроса

• Нестабилен на плохом соединении

Page 33: Как собирать gps треки раз в секунду, экономя траффик

Минусы TCP

Page 34: Как собирать gps треки раз в секунду, экономя траффик

Минусы TCP• Долго• latency

• Дорого• 20 байт на пакет

Page 35: Как собирать gps треки раз в секунду, экономя траффик

Почему UDP•Шлем только датаграммы

• Гарантии не нужны

•Минимализм

Page 36: Как собирать gps треки раз в секунду, экономя траффик

Чем сериализировать?• JSON •MsgPack • Protocol Buffers

Page 37: Как собирать gps треки раз в секунду, экономя траффик

Размер данных

137

127

42

JSON

MsgPack

Protobuff

Page 38: Как собирать gps треки раз в секунду, экономя траффик

Итого• 42 байт пейлоада

• + 20 байт IP хедеров

• = 62 байт на трек

• = 2 мегабайта за смену

• = 6 рублей в деньгах

Page 39: Как собирать gps треки раз в секунду, экономя траффик

Хранение

Page 40: Как собирать gps треки раз в секунду, экономя траффик

Какие данные хранить?• Сессия водителя

• Номер борта

• ID заказа

• Сумма поездки

• Последнее местоположение

• N последних точек

Page 41: Как собирать gps треки раз в секунду, экономя траффик

Что есть• Percona

• Redis

• Elasticsearch

Page 42: Как собирать gps треки раз в секунду, экономя траффик

Нужен геоиндекс• KD-tree

• R-tree

Page 43: Как собирать gps треки раз в секунду, экономя траффик

Какие требования к геоиндексу• Поиск N ближайших точек

• Сбалансированное дерево

Page 44: Как собирать gps треки раз в секунду, экономя траффик

KD-Tree

Page 45: Как собирать gps треки раз в секунду, экономя траффик

Минусы KD-tree• Несбалансированное дерево

• Поиск только одной ближайшей точки

Page 46: Как собирать gps треки раз в секунду, экономя траффик

R-tree

Page 47: Как собирать gps треки раз в секунду, экономя траффик

Что не так с водителями• Плохая связь с интернетом

• Выключил телефон

• Села батарейка

• Выгрузил приложение из памяти

• И еще полдесятка причин

Page 48: Как собирать gps треки раз в секунду, экономя траффик

• Нужен Expire

• Нужен LRU для хранения координат

Page 49: Как собирать gps треки раз в секунду, экономя траффик

Как хранить• В памяти

• R-tree

• Карта с водителями (ключ сессия)

• Карта с водителями (ключ номер борта)

Page 50: Как собирать gps треки раз в секунду, экономя траффик

Какой алгоритм на бэкенде?• Получили пакет по UDP

• Получаем водителя со стораджа

• Если нет – получаем с Redis

• Проверяем, есть ли все нужные данные

• Делаем set в сторадже

Page 51: Как собирать gps треки раз в секунду, экономя траффик

Какой алгоритм на бэкенде?• Если есть – обновляем

• Если нет – инициализируем LRU для координат

• Обновляем инфу в R-tree

Page 52: Как собирать gps треки раз в секунду, экономя траффик

Варианты для реализации• Python

• Ruby

• Node.js

• Go

Page 53: Как собирать gps треки раз в секунду, экономя траффик

Go• Строго типизированный и компилируемый

•Маленький размер docker-контейнеров

•Малый расход ресурсов

•Меньше зоопарк

Page 54: Как собирать gps треки раз в секунду, экономя траффик

Как реализовывали• https://github.com/dhconnelly/rtreego

• LRU – навелосипедили

• UDP – stdlib

• https://github.com/golang/protobuf

• HTTP API

Page 55: Как собирать gps треки раз в секунду, экономя траффик

HTTP API• Ближайшие водители

• Удалить водителя (по номеру борта или сессии)

• Получить информацию о поездке

• Получить маршрут по водителю

Page 56: Как собирать gps треки раз в секунду, экономя траффик

Куда интегрировать• Бэкенд для водителей

• Бэкенд для клиентов

Page 57: Как собирать gps треки раз в секунду, экономя траффик

Как оно выглядит• Ядро – Django

• Водители – Twisted

• Клиенты - Django

Page 58: Как собирать gps треки раз в секунду, экономя траффик

А архитектурно

Nginx

AppBackend

Core

Core

AppBackend Core

Page 59: Как собирать gps треки раз в секунду, экономя траффик

Водители

Nginx

Twisted

Core

CoreTwiste

d Core

Page 60: Как собирать gps треки раз в секунду, экономя траффик

Водители

Водитель

Location backend Core

Twisted

Page 61: Как собирать gps треки раз в секунду, экономя траффик

Клиенты

Клиент

Location backend Core

App backend

Page 62: Как собирать gps треки раз в секунду, экономя траффик

Как эксплуатировать• Логи в stdout

•Метрики в Graphite

• Чеки в Sensu

• Полезный /status

• Боты

Page 63: Как собирать gps треки раз в секунду, экономя траффик

Полезный /status• Uptime since

• HTTP Statuses counters

• Total requests

Page 64: Как собирать gps треки раз в секунду, экономя траффик

Боты• Эмуляция движения водителя

• Эмуляция работы клиента

Page 65: Как собирать gps треки раз в секунду, экономя траффик

Как стало в мобильных приложениях• Получаем местоположение клиента

• Получаем ближайших водителей с маршрутом

• Анимируем каждую машинку

• Обновляем раз в 15 секунд

Page 66: Как собирать gps треки раз в секунду, экономя траффик

Сравнение результатов

Page 67: Как собирать gps треки раз в секунду, экономя траффик
Page 68: Как собирать gps треки раз в секунду, экономя траффик
Page 69: Как собирать gps треки раз в секунду, экономя траффик
Page 70: Как собирать gps треки раз в секунду, экономя траффик

Самый главный слайд• UDP+Protobuf для экономии трафика

• In-memory

• R-tree для выдачи ближайших водителей

• LRU cache для хранения последних координат

• OSRM для выравнивания треков на дороге

Page 71: Как собирать gps треки раз в секунду, экономя траффик

Вопросы• https://github.com/maddevsio

• https://github.com/gen1us2k

• Skype: gen1us2k