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

Geo Search: MongoDB vs S2 Geometry

Geo Search: MongoDB vs S2 Geometry

Степан Пестерников, Avito.

Iskander (Alex) Sharipov

April 25, 2020
Tweet

More Decks by Iskander (Alex) Sharipov

Other Decks in Programming

Transcript

  1. Москва, 2020 Go и Geo в Avito • 12 сервисов

    на Go • Хранилище гео-объектов на MongoDB • Более 25000 запросов в секунду
  2. Москва, 2020 Гео-поиск Задачи: • Рассчёт расстояние от точки до

    точки или полигона • Поиск ближайшего полигона или точки • Попадание точки в полигон
  3. Москва, 2020 Немного истории MongoDB Replica Set Geo Queries Bottleneck

    6k connections 300 Mbps Geo Queries Geo Queries … PHP PHP PHP
  4. Москва, 2020 Миграция на Go Geo Queries … PHP PHP

    PHP Go PHP Go MongoDB Replica Set RPC RPC Go RPC Geo Queries Geo Queries … 100 Connections
  5. Москва, 2020 Что дальше? Новые проблемы? • Поиск ближайшего полигона

    в MongoDB выполняется более 500ms • Задача проверки на попадание в полигон более 20 миллионов координат • Запросы мимо кэша • Задержки сети и точки отказа • MongoDB не покрывает наши запросы по функциональности • Постоянное обновление геоданных
  6. Москва, 2020 Geo Database & Libraries • Redis • Elastic

    • Postgres • Tile38 & BuntDB • Go S2 Geometry
  7. Москва, 2020 Tile38 • RealTime geofencing • Redis протокол •

    R-Tree индекс • Поиск ближайшего (k-nearest neighbor algorithm)
  8. Москва, 2020 Go S2 Geometry vs MongoDB • MongoDB использует

    S2 Geometry C++ • Неоптимальный алгоритм поиска ближайшего полигона или точки
  9. Москва, 2020 Неоптимальный алгоритм MongoDB Так как все Авито- локации

    сосредоточены в полигоне России, то при поиске из-за пределов полигона, алгоритм сводится к «поиску полным перебором»
  10. Москва, 2020 Миграция на Go S2 Geometry • Особенности работы

    и реализации • Нагрузочное тестирование • Сравнение с MongoDB
  11. Москва, 2020 Особенности работы • Проверка на вхождение в полигон

    через Shape Index • В Shape Index не портирован поиск ближайшего полигона* • Поиск ближайшего полигона на основе S2 Cells и B-Tree индекса *https://github.com/golang/geo/issues/59
  12. Москва, 2020 Особенности реализации • Координаты должны идти по порядку

    в одном направлении • Не должно быть повторяющихся координат • Обязательно проверять валидность • Возможно расширять встроенный тип полигона
  13. Москва, 2020 В итоге • Поиск ближайшего полигона ускорился в

    60 раз • Проверка на вхождение в полигон ускорилась в 500 раз • Возможность держать нагрузку более 10000 запросов в секунду • Гео-индекс хранится в памяти приложения • Устранены задержки сети и точки отказа
  14. Москва, 2020 В итоге • Появились возможности проводить эксперименты и

    АБ-тесты с полигонами • Снизили трудозатраты на обновление геоданных • Избавились от миграций