78
Go и геоданные Андрей Минкин MadDevs

GDGNSK Работа с геоданными в Go

Embed Size (px)

Citation preview

Page 1: GDGNSK Работа с геоданными в Go

Go и геоданныеАндрей Минкин MadDevs

Page 2: GDGNSK Работа с геоданными в Go

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

• 10 лет опыта(Sysadmin, Python/Go)• https://github.com/meshbird/meshbird• https://github.com/maddevsio/ariadna

Page 3: GDGNSK Работа с геоданными в Go

Бишкек• 100+ служб такси•~1M жителей

Page 4: GDGNSK Работа с геоданными в Go

Namba taxi• 4 года на рынке•Не менее 8к заказов в сутки• 600+ водителей на линии• 500к+ довольных клиентов

Page 5: GDGNSK Работа с геоданными в Go

Что такое такси•Клиенты • Водители•Операторы

Page 6: GDGNSK Работа с геоданными в Go

AVG response time• Водители 20 ms•Операторы 2.5 ms

Page 7: GDGNSK Работа с геоданными в Go

План доклада• Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты

Page 8: GDGNSK Работа с геоданными в Go

План доклада•Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты

Page 9: GDGNSK Работа с геоданными в Go

Предыстория

Page 10: GDGNSK Работа с геоданными в Go
Page 11: GDGNSK Работа с геоданными в Go

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

Page 12: GDGNSK Работа с геоданными в Go

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

Page 13: GDGNSK Работа с геоданными в Go

А что еще происходит•Какой заказ сейчас выполняет•Какой заказ будет следующим• Есть ли открытые тревоги

Page 14: GDGNSK Работа с геоданными в Go

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

Page 15: GDGNSK Работа с геоданными в Go

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

Page 16: GDGNSK Работа с геоданными в Go
Page 17: GDGNSK Работа с геоданными в Go

Решение•OSRM

Page 18: GDGNSK Работа с геоданными в Go

Пробуем еще• Таймаут – 15 секунд•Делаем запрос – сохраняем координаты•Шлем координаты•Делаем запрос в OSRM – выдаем маршрут в OSRM•Получаем маршрут – анимируем маркер

Page 19: GDGNSK Работа с геоданными в Go

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

Page 20: GDGNSK Работа с геоданными в Go
Page 21: GDGNSK Работа с геоданными в Go

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

Page 22: GDGNSK Работа с геоданными в Go

Релизнулись

Page 23: GDGNSK Работа с геоданными в Go
Page 24: GDGNSK Работа с геоданными в Go

Недочеты• Расчет стоимости – у водителя• 1 трек в 15 секунд – мало•Проблемы с GPS у водителя

Page 25: GDGNSK Работа с геоданными в Go

Проблемы с GPS•Плохой девайс изначально•GPS модуль умирает со временем• Ямы и «глушилки»

Page 26: GDGNSK Работа с геоданными в Go

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

Page 27: GDGNSK Работа с геоданными в Go

Вытекающие задачи• Собирать больше треков водителей•Показывать ближайшие анимированные машины на главном экране• Хранить промежуточную стоимость на сервере• Экономить трафик водителю• Собирать трек раз в секунду

Page 28: GDGNSK Работа с геоданными в Go

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

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

Page 29: GDGNSK Работа с геоданными в Go

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

Page 30: GDGNSK Работа с геоданными в Go

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

Page 31: GDGNSK Работа с геоданными в Go

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

Page 32: GDGNSK Работа с геоданными в Go

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

Page 33: GDGNSK Работа с геоданными в Go

Минусы http•Много хедеров• 18 байт оверхеда (GET / HTTP/1.0<CR><LF> <CR><LF>)• Работает поверх TCP

Page 34: GDGNSK Работа с геоданными в Go

Минусы websocket• Работают поверх http•Нужно сделать upgrade•На установление соединения 2 запроса•Нестабилен на плохом соединении

Page 35: GDGNSK Работа с геоданными в Go

Минусы TCP

Page 36: GDGNSK Работа с геоданными в Go

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

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

Page 37: GDGNSK Работа с геоданными в Go

Почему UDP•Шлем только датаграммы• Гарантии не нужны•Минимализм

Page 38: GDGNSK Работа с геоданными в Go

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

Page 39: GDGNSK Работа с геоданными в Go

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

137

127

42

JSON

MsgPack

Protobuff

Page 40: GDGNSK Работа с геоданными в Go

Итого• 42 байт пейлоада•+ 20 байт IP хедеров•= 62 байт на трек•= 2 мегабайта за смену•= 6 рублей в деньгах

Page 41: GDGNSK Работа с геоданными в Go

Хранение

Page 42: GDGNSK Работа с геоданными в Go

Какие данные хранить?• Сессия водителя•Номер борта• ID заказа• Сумма поездки•Последнее местоположение•N последних точек

Page 43: GDGNSK Работа с геоданными в Go

Что есть• Percona• Redis• Elasticsearch

Page 44: GDGNSK Работа с геоданными в Go

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

Page 45: GDGNSK Работа с геоданными в Go

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

Page 46: GDGNSK Работа с геоданными в Go

KD-Tree

Page 47: GDGNSK Работа с геоданными в Go

Минусы KD-tree•Несбалансированное дерево•Поиск только одной ближайшей точки

Page 48: GDGNSK Работа с геоданными в Go

R-tree

Page 49: GDGNSK Работа с геоданными в Go

Ок, где взять?• https://github.com/dhconnelly/rtreego

Page 50: GDGNSK Работа с геоданными в Go

Что не так с водителями•Плохая связь с интернетом• Выключил телефон• Села батарейка• Выгрузил приложение из памяти•И еще полдесятка причин

Page 51: GDGNSK Работа с геоданными в Go

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

Page 52: GDGNSK Работа с геоданными в Go

Как хранить• В памяти• R-tree•Карта с водителями (ключ сессия)•Карта с водителями (ключ номер борта)

Page 53: GDGNSK Работа с геоданными в Go

Какой алгоритм на бэкенде?•Получили пакет по UDP•Получаем водителя со стораджа• Если нет – получаем с Redis•Проверяем, есть ли все нужные данные•Делаем set в сторадже

Page 54: GDGNSK Работа с геоданными в Go

Какой алгоритм на бэкенде?• Если есть – обновляем• Если нет – инициализируем LRU для координат•Обновляем инфу в R-tree

Page 55: GDGNSK Работа с геоданными в Go

Варианты для реализации• Python• Ruby•Node.js•Go

Page 56: GDGNSK Работа с геоданными в Go

Go• Строго типизированный и компилируемый•Маленький размер docker-контейнеров•Малый расход ресурсов•Меньше зоопарк

Page 57: GDGNSK Работа с геоданными в Go

Как реализовывали• https://github.com/dhconnelly/rtreego• LRU – навелосипедили•UDP – stdlib• https://github.com/golang/protobuf•HTTP API

Page 58: GDGNSK Работа с геоданными в Go

HTTP API• Ближайшие водители• Удалить водителя (по номеру борта или сессии)•Получить информацию о поездке•Получить маршрут по водителю

Page 59: GDGNSK Работа с геоданными в Go

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

Page 60: GDGNSK Работа с геоданными в Go

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

Page 61: GDGNSK Работа с геоданными в Go

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

Nginx

AppBackendCore

Core

AppBackend Core

Page 62: GDGNSK Работа с геоданными в Go

Водители

Nginx

Twisted

Core

CoreTwiste

d Core

Page 63: GDGNSK Работа с геоданными в Go

Водители

Водитель

Location backend Core

Twisted

Page 64: GDGNSK Работа с геоданными в Go

Клиенты

Клиент

Location backend Core

App backend

Page 65: GDGNSK Работа с геоданными в Go

Как эксплуатировать•Логи в stdout•Метрики в Graphite• Чеки в Sensu•Полезный /status• Боты

Page 66: GDGNSK Работа с геоданными в Go

Полезный /status•Uptime since•HTTP Statuses counters • Total requests

Page 67: GDGNSK Работа с геоданными в Go

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

Page 68: GDGNSK Работа с геоданными в Go

Как стало в мобильных приложениях•Получаем местоположение клиента•Получаем ближайших водителей с маршрутом• Анимируем каждую машинку•Обновляем раз в 15 секунд

Page 69: GDGNSK Работа с геоданными в Go

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

Page 70: GDGNSK Работа с геоданными в Go
Page 71: GDGNSK Работа с геоданными в Go
Page 72: GDGNSK Работа с геоданными в Go
Page 73: GDGNSK Работа с геоданными в Go

Самый главный слайд•UDP+Protobuf для экономии трафика• In-memory• R-tree для выдачи ближайших водителей• LRU cache для хранения последних координат•OSRM для выравнивания треков на дороге

Page 74: GDGNSK Работа с геоданными в Go

План доклада• Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты

Page 75: GDGNSK Работа с геоданными в Go

Интеграция с 2ГИС• https://github.com/paulmach/go.geo• Расчет расстояния от точки до точки• Удобно было хранить точки

Page 76: GDGNSK Работа с геоданными в Go

План доклада• Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты

Page 78: GDGNSK Работа с геоданными в Go

Вопросы• https://github.com/maddevsio•@gen1us2k (twitter,github,facebook,skype,telegram)