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.

Avatar for Iskander (Alex) Sharipov

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 В итоге • Появились возможности проводить эксперименты и

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