Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

636 views

Published on

Слайды с GDG DevFest Новосибирск про го, геоданные, ненависть к нод.жс и UDP :)

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

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

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

×