69
ObjectManager или как работать с действительно большим количеством объектов на карте Марина Степанова, Яндекс

ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

  • Upload
    ontico

  • View
    444

  • Download
    15

Embed Size (px)

DESCRIPTION

Доклад Марины Степановой на HighLoad++ 2014.

Citation preview

Page 1: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

ObjectManager или как работать с действительно большим количеством объектов на картеМарина Степанова, Яндекс

Page 2: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

О чем поговорим• Почему сложно показать много точек на

карте, обзор решений• Как отрисовать большое количество

меток на клиенте• Загрузка меток по требованию• Организация хранения и обработки

данных на сервере

Page 3: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Почему сложно хорошо показать много меток на карте?

Page 4: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)
Page 5: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)
Page 6: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решаем задачу «в лоб»

Сервер

page.html

Page 7: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

page.html<!DOCTYPE html><html><head> <script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script> <script type="text/javascript">

ymaps.ready(function () { var myMap = new ymaps.Map('map', { center: [55.76, 37.64], zoom: 10 });}); </script> </head> <body><div id="map"></div></body></html>

Page 8: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

А теперь добавим метки!

Page 9: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

X 50 000

page.html

Page 10: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Очевидные недостатки

• page.html весит несколько Мб и страница долго загружается

• Мы передаем на клиент слишком много данных

• Мы рисуем на клиенте данные, которые пользователь может не видеть

Page 11: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Что предлагалось пользователям многие годы?*

*Не только в API Яндекс.Карт

Page 12: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решение №1 – активные области

Page 13: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решение №1 – активные области

Page 14: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решение №1 – активные области

Плюсы Минусы

Очень быстрый рендеринг на клиенте

Оооочень сложная серверная часть

Передаются только данные для видимой

области

Клиентская картинка абсолютно статична

Page 15: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решение №2 - кластеризатор

Page 16: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решение №2 – кластеризатор

Плюсы Минусы

Просто использовать Клиент тратит время на кластеризацию

Дизайн определяется и настраивается на

клиенте

Не решена проблема оптимальной загрузки

данных

Page 17: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решение №2 – кластеризатор

X 50 000

new ymaps.Placemark([45.3, 25.45])new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

50 000

Page 18: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Решение №2 – кластеризатор

X 50 000

new ymaps.Placemark([45.3, 25.45])new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

50 000

Лишние программные инициализации

Page 19: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Что нужно в идеале?

• Никаких лишних инициализаций на клиенте

• Запрашиваем данные пачками асинхронно

• Передаем на клиент только данные, которые видит пользователь

• Рисуем на клиенте только данные, которые видит пользователь

Page 20: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Что мы сделали для клиентской оптимизации

Page 21: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Храним только данные

• Все данные хранятся как их JSON-описания в специальном менеджере

• Программные сущности создаются только при необходимости нарисовать объект

Page 22: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

X 50 000

new ymaps.Placemark([45.3, 25.45])new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

new ymaps.Placemark([45.3, 25.45])

50 000

Храним только данные

Page 23: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Как ускорить геообъекты?

Page 24: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

BalloonHintEditorOptionsEventsOverlay…

Page 25: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

BalloonHintEditorOptionsEventsOverlay…

Page 26: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

BalloonHintEditorOptionsEventsOverlay…

Page 27: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

BalloonHintEditorOptionsEventsOverlay…

Компонент, отвечающий непосредственно за отрисовку на карте

Page 28: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

BalloonHintEditorOptionsEvents…

ObjectCollection

Overlay Overlay Overlay

Page 29: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Получился ObjectManager• Хранит данные и не создает

программные сущности без надобности• Мы вынесли всю инфраструктуру в

общую коллекцию, в метках оставили только самое нужное

https://clck.ru/9LqPp

Page 30: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Время добавления на карту меток с кластеризацией

1000 10000 500000

1000

2000

3000

4000

5000

6000

ObjectManagerPlacemarks

Page 31: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Поговорим про загрузку данных с сервера на клиент

Page 32: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Классическое решение

Page 33: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Классическое решение

Page 34: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Минусы подхода

• На малейший сдвиг нужно генерировать новый запрос

• Многократная загрузка одних и тех же данных

• Запросы всегда разные, непонятно, как кешировать

Page 35: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Грузим данные потайлово

Page 36: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Видимая область карты

Тайлы в видимой области

Page 37: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Загружаем данные потайлово

• Данные загружаются всегда по одним и тем же областям – легче организовать кеширование

• Запоминаем, какие тайлы подгружены, а какие нет

• Небольшой сдвиг карты не вызывает дозагрузку

Page 38: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

RemoteObjectManager, LoadingObjectManager• Следят за видимой областью карты• Следят, какие данные загружены, а какие еще

нет• Отправляют потайловые запросы за данными на

сервер

clck.ru/9Lp2Jclck.ru/9Lp2S

Page 39: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

LoadingObjectManagerЗагружает метки и кластеризует на клиенте

RemoteObjectManagerОтвечает за загрузку и отображение результатов серверной кластеризации

Page 40: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Режимы запросов за данными

Page 41: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Как организовать серверную часть?

Page 42: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Генерация статических файлов

Page 43: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Генерация статических файлов

• Не требует сервера, отвечающего на запросы клиента

• Файлы могут занять очень много дискового пространства

• Нужен скрипт, генерирующий эти файлы с некоторой периодичностью

• Очень примитивное решение, подойдет для небольших демо-проектов

Page 44: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Пространственные базы данных

• MySQL – SPATIAL• PostgreSQL – PostGIS• Oracle• MongoDB• …

Page 45: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Поговорим про серверную кластеризацию точек

Page 46: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Кластеризация на клиенте

Формирование списка точек

Передача на клиент

Кластеризация Отображение результата

Кластеризация Отображение результата

Кластеризация Отображение результата

Сервер Клиент

Page 47: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Кластеризация на клиенте

Формирование списка точек

Передача на клиент

Кластеризация Отображение результата

Кластеризация Отображение результата

Кластеризация Отображение результата

Сервер Клиент

Page 48: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Кластеризация на сервере

Формирование списка точек Кластеризация Передача на

клиент

Отображение результата

Отображение результата

Отображение результата

Сервер Клиент

Page 49: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v1

БД Кластеризация Отправка на клиент

Page 50: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v1

1. Получаем данные для тайла из базы2. Кластеризуем любым алгоритмом3. Отправляем ответ на клиент

SELECT Id, long, lat,FROM bigTable WHERE latLon in bounds

Page 51: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v1

Плюсы Минусы

Можно выбрать любой алгоритм кластеризации

Чем красивее алгоритм, тем дольше он работает

Нужно хорошо организовать

кеширование ответа

Page 52: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Grid-кластеризация

Page 53: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v2

БДОтправка на

клиент

Данные, сгруппированные по grid-кластерам

Page 54: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v2

SELECT MIN(id) AS minId, COUNT(id) AS count, AVG(long) AS long, AVG(lat) AS lat,FLOOR( long/gridFactor) * gridFactor as gridX,FLOOR( lat/gridFactor) * gridFactor AS gridYFROM bigTable WHERE latLon in bounds GROUP BY gridX,gridY

Вместе с выборкой объектов сразу объединяем объекты в grid-кластеры

Page 55: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v2

Плюсы Минусы

Не надо писать дополнительной логики

по кластеризации

Grid-кластеризация не самая красивая

Быстро работает Ваша база данных вечно считает, вы не

используете индексы

Page 56: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Quadkey для grid-кластеризации

Page 58: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

«Quadkey»tileX = 3 = 0112

tileY = 5 = 1012

quadkey = 1001112 = 2134 = “213”

Используем битовые маски для выборки объектов в тайлеzoom = 1, mask = 110000zoom = 2, mask = 111100…

Page 59: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v3

БДОтправка на

клиент

Данные, сгруппированные по grid-кластерам

+ quadkey для каждой точки

Page 60: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v3

SELECT MIN(id) AS minId, COUNT(id) AS count, AVG(long) AS long, AVG(lat) AS latFROM wiki WHERE QuadCode between $Q1 and $Q2. GROUP BY (QuadCode & $free)

Где:free - маска «вариативности» хвоста. free = 0xFFFFFFFF ^ (($Q2^$Q1)>>(2*gridFactor));Q1,Q2 - диапазоны поиска QuadKey

Пример:

QuadCode: 320132321(base4), 9 знаков из 16(uint32)Q1 : 320132321|0000000Q2 : 320132321|3333333free:333333333|3330000 (+3 зума, кластер 32х32)

Page 61: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Серверная кластеризация. v3

Плюсы Минусы

Очень быстро Grid-кластеризация не самая красивая

Нужно заранее насчитать Quad-коды

Page 62: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Поговорим про кеширование и версионирование данных

Page 63: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

С кешированием все просто

• Поскольку запросы всегда потайловые, кешируем ответ сервера для тайла на определенном зуме

• Пишите данные в файлы, используйте Memcached, Redis и тд

• Если запрос поступает для большой тайловой области, разбиваем его на отдельные тайлы и собираем ответ из кеша потайлово

Page 64: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Опасный момент – обновление данных

Page 65: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Опасный момент – обновление данных

Page 66: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Опасный момент – обновление данных

Загружены данные старой версии

Сюда могут подгрузиться данные уже новой версии

Page 67: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Закладываем версионирование в архитектуру

• Передаем на клиент версию данных• Клиент всегда отправляет запросы с указанием версии

данных• Храним несколько последних версий на сервере• Системы кеширования тоже завязываем на версию• Если нужно, продумываем автообновление версии на

клиенте

Page 68: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Полезные ссылки

• Работа с большим количеством объектов – clck.ru/9Lp2e

• Если есть вопросы, пишите в клуб – clubs.ya.ru/mapsapi/

Page 69: ObjectManager, или как работать с большим количеством объектов на карте, Марина Степанова (Яндекс)

Спасибо за внимание!Марина Степанова, руководитель группы разработки API Яндекс.Карт

[email protected]