Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Слайды с доклада на Highload++ 2016

Andrew Minkin

November 08, 2016
Tweet

More Decks by Andrew Minkin

Other Decks in Programming

Transcript

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

    10 лет опыта(Sysadmin, Python/Go) • https://github.com/meshbird/meshbird • https://github.com/maddevsio/ariadna
  2. Namba taxi • 4 года на рынке • Не менее

    8к заказов в сутки • 600+ водителей на линии • 500к+ довольных клиентов
  3. А что еще происходит • Какой заказ сейчас выполняет •

    Какой заказ будет следующим • Есть ли открытые тревоги
  4. Пробуем еще • Таймаут – 15 секунд • Делаем запрос

    – сохраняем координаты • Шлем координаты • Делаем запрос в OSRM – выдаем маршрут в OSRM • Получаем маршрут – анимируем маркер
  5. Недочеты • Расчет стоимости – у водителя • 1 трек

    в 15 секунд – мало • Проблемы с GPS у водителя
  6. Проблемы с GPS • Плохой девайс изначально • GPS модуль

    умирает со временем • Ямы и «глушилки»
  7. Вытекающие задачи • Собирать больше треков водителей • Показывать ближайшие

    анимированные машины на главном экране • Хранить промежуточную стоимость на сервере • Экономить трафик водителю • Собирать трек раз в секунду
  8. Расходы водителя за смену в Бишкеке • 550 р бензин

    • 200 р еда • 200 р комиссия • Средний чек – 100р
  9. Минусы http • Много хедеров • 18 байт оверхеда (GET

    / HTTP/1.0<CR><LF> <CR><LF>) • Работает поверх TCP
  10. Минусы websocket • Работают поверх http • Нужно сделать upgrade

    • На установление соединения 2 запроса • Нестабилен на плохом соединении
  11. Итого • 42 байт пейлоада • + 20 байт IP

    хедеров • = 62 байт на трек • = 2 мегабайта за смену • = 6 рублей в деньгах
  12. Какие данные хранить? • Сессия водителя • Номер борта •

    ID заказа • Сумма поездки • Последнее местоположение • N последних точек
  13. Что не так с водителями • Плохая связь с интернетом

    • Выключил телефон • Села батарейка • Выгрузил приложение из памяти • И еще полдесятка причин
  14. Как хранить • В памяти • R-tree • Карта с

    водителями (ключ сессия) • Карта с водителями (ключ номер борта)
  15. Какой алгоритм на бэкенде? • Получили пакет по UDP •

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

    Если нет – инициализируем LRU для координат • Обновляем инфу в R-tree
  17. HTTP API • Ближайшие водители • Удалить водителя (по номеру

    борта или сессии) • Получить информацию о поездке • Получить маршрут по водителю
  18. Как эксплуатировать • Логи в stdout • Метрики в Graphite

    • Чеки в Sensu • Полезный /status • Боты
  19. Как стало в мобильных приложениях • Получаем местоположение клиента •

    Получаем ближайших водителей с маршрутом • Анимируем каждую машинку • Обновляем раз в 15 секунд
  20. Самый главный слайд • UDP+Protobuf для экономии трафика • In-memory

    • R-tree для выдачи ближайших водителей • LRU cache для хранения последних координат • OSRM для выравнивания треков на дороге