gdgnsk Работа с геоданными в go
TRANSCRIPT
![Page 1: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/1.jpg)
Go и геоданныеАндрей Минкин MadDevs
![Page 2: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/2.jpg)
Кто я• 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](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/3.jpg)
Бишкек• 100+ служб такси•~1M жителей
![Page 4: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/4.jpg)
Namba taxi• 4 года на рынке•Не менее 8к заказов в сутки• 600+ водителей на линии• 500к+ довольных клиентов
![Page 5: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/5.jpg)
Что такое такси•Клиенты • Водители•Операторы
![Page 6: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/6.jpg)
AVG response time• Водители 20 ms•Операторы 2.5 ms
![Page 7: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/7.jpg)
План доклада• Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты
![Page 8: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/8.jpg)
План доклада•Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты
![Page 9: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/9.jpg)
Предыстория
![Page 10: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/10.jpg)
![Page 11: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/11.jpg)
С чего мы начинали
![Page 12: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/12.jpg)
Обновление местоположения• Водитель: раз в 15 секунд•Клиент: раз в 15 секунд
![Page 13: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/13.jpg)
А что еще происходит•Какой заказ сейчас выполняет•Какой заказ будет следующим• Есть ли открытые тревоги
![Page 14: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/14.jpg)
Первые пробы•Делаем запрос – сохраняем координаты•Делаем запрос – анимируем машину
![Page 15: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/15.jpg)
Первые проблемы•Машинку колбасит•Машинка едет по полям, лесам
![Page 16: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/16.jpg)
![Page 17: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/17.jpg)
Решение•OSRM
![Page 18: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/18.jpg)
Пробуем еще• Таймаут – 15 секунд•Делаем запрос – сохраняем координаты•Шлем координаты•Делаем запрос в OSRM – выдаем маршрут в OSRM•Получаем маршрут – анимируем маркер
![Page 19: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/19.jpg)
Проблемы•Одностороннее движение
![Page 20: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/20.jpg)
![Page 21: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/21.jpg)
Решение•Проверка на 20 метров
![Page 22: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/22.jpg)
Релизнулись
![Page 23: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/23.jpg)
![Page 24: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/24.jpg)
Недочеты• Расчет стоимости – у водителя• 1 трек в 15 секунд – мало•Проблемы с GPS у водителя
![Page 25: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/25.jpg)
Проблемы с GPS•Плохой девайс изначально•GPS модуль умирает со временем• Ямы и «глушилки»
![Page 26: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/26.jpg)
Новые фичи• Хотим все это на главном экране
![Page 27: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/27.jpg)
Вытекающие задачи• Собирать больше треков водителей•Показывать ближайшие анимированные машины на главном экране• Хранить промежуточную стоимость на сервере• Экономить трафик водителю• Собирать трек раз в секунду
![Page 28: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/28.jpg)
Расходы водителя за смену в Бишкеке• 550 р бензин• 200 р еда• 200 р комиссия
• Средний чек – 100р
![Page 29: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/29.jpg)
Расходы на интернет• 100 р на водителя за смену• 100 000 р в день.
![Page 30: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/30.jpg)
Что такое трек и как он выглядит• Latitude• Longitude• Session•OrderID• TripCost
![Page 31: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/31.jpg)
Экономим трафик водителю• Уложить 1 трек в 100 байт•И чтобы работало быстро
![Page 32: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/32.jpg)
Огласите весь список, пожалуйста•HTTP •WebSockets• TCP•UDP
![Page 33: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/33.jpg)
Минусы http•Много хедеров• 18 байт оверхеда (GET / HTTP/1.0<CR><LF> <CR><LF>)• Работает поверх TCP
![Page 34: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/34.jpg)
Минусы websocket• Работают поверх http•Нужно сделать upgrade•На установление соединения 2 запроса•Нестабилен на плохом соединении
![Page 35: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/35.jpg)
Минусы TCP
![Page 36: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/36.jpg)
Минусы TCP•Долго• latency
•Дорого• 20 байт на пакет
![Page 37: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/37.jpg)
Почему UDP•Шлем только датаграммы• Гарантии не нужны•Минимализм
![Page 38: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/38.jpg)
Чем сериализировать?• JSON •MsgPack • Protocol Buffers
![Page 39: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/39.jpg)
Размер данных
137
127
42
JSON
MsgPack
Protobuff
![Page 40: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/40.jpg)
Итого• 42 байт пейлоада•+ 20 байт IP хедеров•= 62 байт на трек•= 2 мегабайта за смену•= 6 рублей в деньгах
![Page 41: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/41.jpg)
Хранение
![Page 42: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/42.jpg)
Какие данные хранить?• Сессия водителя•Номер борта• ID заказа• Сумма поездки•Последнее местоположение•N последних точек
![Page 43: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/43.jpg)
Что есть• Percona• Redis• Elasticsearch
![Page 44: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/44.jpg)
Нужен геоиндекс• KD-tree• R-tree
![Page 45: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/45.jpg)
Какие требования к геоиндексу•Поиск N ближайших точек• Сбалансированное дерево
![Page 46: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/46.jpg)
KD-Tree
![Page 47: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/47.jpg)
Минусы KD-tree•Несбалансированное дерево•Поиск только одной ближайшей точки
![Page 48: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/48.jpg)
R-tree
![Page 50: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/50.jpg)
Что не так с водителями•Плохая связь с интернетом• Выключил телефон• Села батарейка• Выгрузил приложение из памяти•И еще полдесятка причин
![Page 51: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/51.jpg)
•Нужен Expire•Нужен LRU для хранения координат
![Page 52: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/52.jpg)
Как хранить• В памяти• R-tree•Карта с водителями (ключ сессия)•Карта с водителями (ключ номер борта)
![Page 53: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/53.jpg)
Какой алгоритм на бэкенде?•Получили пакет по UDP•Получаем водителя со стораджа• Если нет – получаем с Redis•Проверяем, есть ли все нужные данные•Делаем set в сторадже
![Page 54: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/54.jpg)
Какой алгоритм на бэкенде?• Если есть – обновляем• Если нет – инициализируем LRU для координат•Обновляем инфу в R-tree
![Page 55: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/55.jpg)
Варианты для реализации• Python• Ruby•Node.js•Go
![Page 56: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/56.jpg)
Go• Строго типизированный и компилируемый•Маленький размер docker-контейнеров•Малый расход ресурсов•Меньше зоопарк
![Page 57: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/57.jpg)
Как реализовывали• https://github.com/dhconnelly/rtreego• LRU – навелосипедили•UDP – stdlib• https://github.com/golang/protobuf•HTTP API
![Page 58: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/58.jpg)
HTTP API• Ближайшие водители• Удалить водителя (по номеру борта или сессии)•Получить информацию о поездке•Получить маршрут по водителю
![Page 59: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/59.jpg)
Куда интегрировать• Бэкенд для водителей• Бэкенд для клиентов
![Page 60: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/60.jpg)
Как оно выглядит• Ядро – Django• Водители – Twisted •Клиенты - Django
![Page 61: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/61.jpg)
А архитектурно
Nginx
AppBackendCore
Core
AppBackend Core
![Page 62: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/62.jpg)
Водители
Nginx
Twisted
Core
CoreTwiste
d Core
![Page 63: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/63.jpg)
Водители
Водитель
Location backend Core
Twisted
![Page 64: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/64.jpg)
Клиенты
Клиент
Location backend Core
App backend
![Page 65: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/65.jpg)
Как эксплуатировать•Логи в stdout•Метрики в Graphite• Чеки в Sensu•Полезный /status• Боты
![Page 66: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/66.jpg)
Полезный /status•Uptime since•HTTP Statuses counters • Total requests
![Page 67: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/67.jpg)
Боты• Эмуляция движения водителя• Эмуляция работы клиента
![Page 68: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/68.jpg)
Как стало в мобильных приложениях•Получаем местоположение клиента•Получаем ближайших водителей с маршрутом• Анимируем каждую машинку•Обновляем раз в 15 секунд
![Page 69: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/69.jpg)
Сравнение результатов
![Page 70: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/70.jpg)
![Page 71: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/71.jpg)
![Page 72: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/72.jpg)
![Page 73: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/73.jpg)
Самый главный слайд•UDP+Protobuf для экономии трафика• In-memory• R-tree для выдачи ближайших водителей• LRU cache для хранения последних координат•OSRM для выравнивания треков на дороге
![Page 74: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/74.jpg)
План доклада• Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты
![Page 75: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/75.jpg)
Интеграция с 2ГИС• https://github.com/paulmach/go.geo• Расчет расстояния от точки до точки• Удобно было хранить точки
![Page 76: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/76.jpg)
План доклада• Сбор GPS треков раз в секунду•Пробки от 2ГИС в Бишкеке•Прочие инструменты
![Page 77: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/77.jpg)
А что есть еще?• https://github.com/nfleet/via• https://github.com/hailocab/go-geoindex• https://github.com/azr/kdtree• https://github.com/maddevsio/ariadna
![Page 78: GDGNSK Работа с геоданными в Go](https://reader030.vdocuments.pub/reader030/viewer/2022033020/5872cd851a28ab74188b4627/html5/thumbnails/78.jpg)
Вопросы• https://github.com/maddevsio•@gen1us2k (twitter,github,facebook,skype,telegram)