SlideShare a Scribd company logo
1 of 69
ObjectManager или как 
работать с действительно 
большим количеством 
объектов на карте 
Марина Степанова, 
Яндекс
О чем поговорим 
• Почему сложно показать много точек на 
карте, обзор решений 
• Как отрисовать большое количество меток на 
клиенте 
• Загрузка меток по требованию 
• Организация хранения и обработки данных 
на сервере
Почему сложно хорошо показать 
много меток на карте?
Решаем задачу «в лоб» 
Сервер 
page.html
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>
А теперь добавим метки!
X 50 000 
page.html
Очевидные недостатки 
• page.html весит несколько Мб и страница 
долго загружается 
• Мы передаем на клиент слишком много 
данных 
• Мы рисуем на клиенте данные, которые 
пользователь может не видеть
Что предлагалось 
пользователям многие годы?* 
*Не только в API Яндекс.Карт
Решение №1 – активные области
Решение №1 – активные области
Решение №1 – активные области 
Плюсы Минусы 
Очень быстрый 
рендеринг на клиенте 
Оооочень сложная 
серверная часть 
Передаются только 
данные для видимой 
области 
Клиентская картинка 
абсолютно статична
Решение №2 - кластеризатор
Решение №2 – кластеризатор 
Плюсы Минусы 
Просто использовать Клиент тратит время на 
кластеризацию 
Дизайн определяется и 
настраивается на 
клиенте 
Не решена проблема 
оптимальной загрузки 
данных
Решение №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
Решение №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 
Лишние программные 
инициализации
Что нужно в идеале? 
• Никаких лишних инициализаций на 
клиенте 
• Запрашиваем данные пачками асинхронно 
• Передаем на клиент только данные, 
которые видит пользователь 
• Рисуем на клиенте только данные, которые 
видит пользователь
Что мы сделали для клиентской 
оптимизации
Храним только данные 
• Все данные хранятся как их JSON- 
описания в специальном менеджере 
• Программные сущности создаются только 
при необходимости нарисовать объект
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 
Храним только данные
Как ускорить геообъекты?
Balloon 
Hint 
Editor 
Options 
Events 
Overlay 
…
Balloon 
Hint 
Editor 
Options 
Events 
Overlay 
…
Balloon 
Hint 
Editor 
Options 
Events 
Overlay 
…
Balloon 
Hint 
Editor 
Options 
Events 
Overlay 
… 
Компонент, отвечающий 
непосредственно за 
отрисовку на карте
ObjectCollection 
Balloon 
Hint 
Editor 
Options 
Events 
… 
Overlay Overlay Overlay
Получился ObjectManager 
• Хранит данные и не создает программные 
сущности без надобности 
• Мы вынесли всю инфраструктуру в общую 
коллекцию, в метках оставили только самое 
нужное 
https://clck.ru/9LqPp
Время добавления на карту меток с 
кластеризацией 
6000 
5000 
4000 
3000 
2000 
1000 
0 
1000 10000 50000 
ObjectManager 
Placemarks
Поговорим про загрузку данных 
с сервера на клиент
Классическое решение
Классическое решение
Минусы подхода 
• На малейший сдвиг нужно генерировать 
новый запрос 
• Многократная загрузка одних и тех же 
данных 
• Запросы всегда разные, непонятно, как 
кешировать
Грузим данные потайлово
Видимая область карты 
Тайлы в видимой области
Загружаем данные потайлово 
• Данные загружаются всегда по одним и тем же 
областям – легче организовать кеширование 
• Запоминаем, какие тайлы подгружены, а 
какие нет 
• Небольшой сдвиг карты не вызывает 
дозагрузку
RemoteObjectManager, 
LoadingObjectManager 
• Следят за видимой областью карты 
• Следят, какие данные загружены, а какие еще нет 
• Отправляют потайловые запросы за данными на 
сервер 
clck.ru/9Lp2J 
clck.ru/9Lp2S
LoadingObjectManager 
Загружает метки и кластеризует на 
клиенте 
RemoteObjectManager 
Отвечает за загрузку и отображение 
результатов серверной кластеризации
Режимы запросов за данными
Как организовать серверную 
часть?
Генерация статических файлов
Генерация статических файлов 
• Не требует сервера, отвечающего на запросы клиента 
• Файлы могут занять очень много дискового 
пространства 
• Нужен скрипт, генерирующий эти файлы с некоторой 
периодичностью 
• Очень примитивное решение, подойдет для 
небольших демо-проектов
Пространственные базы данных 
• MySQL – SPATIAL 
• PostgreSQL – PostGIS 
• Oracle 
• MongoDB 
• …
Поговорим про серверную 
кластеризацию точек
Кластеризация на клиенте 
Сервер Клиент 
Формирование 
списка точек 
Передача на 
клиент 
Кластеризация 
Отображение 
результата 
Кластеризация 
Отображение 
результата 
Кластеризация 
Отображение 
результата
Кластеризация на клиенте 
Сервер Клиент 
Формирование 
списка точек 
Передача на 
клиент 
Кластеризация 
Отображение 
результата 
Кластеризация 
Отображение 
результата 
Кластеризация 
Отображение 
результата
Кластеризация на сервере 
Сервер Клиент 
Формирование 
списка точек 
Кластеризация 
Передача на 
клиент 
Отображение 
результата 
Отображение 
результата 
Отображение 
результата
Серверная кластеризация. v1 
БД Кластеризация 
Отправка на 
клиент
Серверная кластеризация. v1 
SELECT Id, long, lat, 
FROM bigTable 
WHERE latLon in bounds 
1. Получаем данные для тайла из базы 
2. Кластеризуем любым алгоритмом 
3. Отправляем ответ на клиент
Серверная кластеризация. v1 
Плюсы Минусы 
Можно выбрать любой 
алгоритм кластеризации 
Чем красивее алгоритм, 
тем дольше он работает 
Нужно хорошо 
организовать 
кеширование ответа
Grid-кластеризация
Серверная кластеризация. v2 
БД 
Отправка на 
клиент 
Данные, сгруппированные 
по grid-кластерам
Серверная кластеризация. 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 gridY 
FROM bigTable 
WHERE latLon in bounds 
GROUP BY gridX,gridY 
Вместе с выборкой объектов сразу объединяем объекты в grid-кластеры
Серверная кластеризация. v2 
Плюсы Минусы 
Не надо писать 
дополнительной логики 
по кластеризации 
Grid-кластеризация не 
самая красивая 
Быстро работает Ваша база данных вечно 
считает, вы не 
используете индексы
Quadkey для 
grid-кластеризации
«Quadkey» 
clck.ru/4Xg6s
«Quadkey» 
tileX = 3 = 0112 
tileY = 5 = 1012 
quadkey = 1001112 = 2134 = “213” 
Используем битовые маски для выборки объектов в тайле 
zoom = 1, mask = 110000 
zoom = 2, mask = 111100 
…
Серверная кластеризация. v3 
БД 
Отправка на 
клиент 
Данные, сгруппированные 
по grid-кластерам 
+ quadkey для каждой 
точки
Серверная кластеризация. v3 
SELECT MIN(id) AS minId, COUNT(id) AS count, AVG(long) AS long, AVG(lat) AS lat 
FROM 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|0000000 
Q2 : 320132321|3333333 
free:333333333|3330000 (+3 зума, кластер 32х32)
Серверная кластеризация. v3 
Плюсы Минусы 
Очень быстро Grid-кластеризация не 
самая красивая 
Нужно заранее 
насчитать Quad-коды
Поговорим про кеширование и 
версионирование данных
С кешированием все просто 
• Поскольку запросы всегда потайловые, кешируем 
ответ сервера для тайла на определенном зуме 
• Пишите данные в файлы, используйте Memcached, 
Redis и тд 
• Если запрос поступает для большой тайловой 
области, разбиваем его на отдельные тайлы и 
собираем ответ из кеша потайлово
Опасный момент – обновление 
данных
Опасный момент – обновление 
данных
Опасный момент – обновление 
данных 
Загружены данные 
старой версии 
Сюда могут 
подгрузиться данные 
уже новой версии
Закладываем версионирование в 
архитектуру 
• Передаем на клиент версию данных 
• Клиент всегда отправляет запросы с указанием версии 
данных 
• Храним несколько последних версий на сервере 
• Системы кеширования тоже завязываем на версию 
• Если нужно, продумываем автообновление версии на 
клиенте
Полезные ссылки 
• Работа с большим количеством объектов – 
clck.ru/9Lp2e 
• Если есть вопросы, пишите в клуб – 
clubs.ya.ru/mapsapi/
Спасибо за внимание! 
Марина Степанова, 
руководитель группы разработки API 
Яндекс.Карт 
mstepanova@yandex-team.ru

More Related Content

What's hot

Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...Yandex
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JSFestUA
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsPlatonov Sergey
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Platonov Sergey
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Platonov Sergey
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьYandex
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьYandex
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?PyNSK
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 

What's hot (20)

Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. Асинхронность
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 

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

Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow Vadim Nesterov
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Fwdays
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
 
Grpahite&amp;grafana
Grpahite&amp;grafanaGrpahite&amp;grafana
Grpahite&amp;grafanaLevon Avakyan
 
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...Andrey Gershun
 
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...Uptime community
 
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...Uptime Community
 
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"Fwdays
 
Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seemsAleksandr Tarasov
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
как из трех стоек сделать две.
как из трех стоек сделать две.как из трех стоек сделать две.
как из трех стоек сделать две.Serguei Gitinsky
 
Big data moscow meetup
Big data moscow meetup Big data moscow meetup
Big data moscow meetup Shamim bhuiyan
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Ontico
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Vadim Madison
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...Vyacheslav Nikulin
 
SIMD - что это такое?
SIMD - что это такое?SIMD - что это такое?
SIMD - что это такое?Nikita Sivukhin
 
High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHighLoad2009
 
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...Ontico
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...rit2011
 

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

Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Grpahite&amp;grafana
Grpahite&amp;grafanaGrpahite&amp;grafana
Grpahite&amp;grafana
 
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
 
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
 
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
 
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"
 
Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seems
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
как из трех стоек сделать две.
как из трех стоек сделать две.как из трех стоек сделать две.
как из трех стоек сделать две.
 
Big data moscow meetup
Big data moscow meetup Big data moscow meetup
Big data moscow meetup
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...
 
SIMD - что это такое?
SIMD - что это такое?SIMD - что это такое?
SIMD - что это такое?
 
High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus Ready
 
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

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

  • 1. ObjectManager или как работать с действительно большим количеством объектов на карте Марина Степанова, Яндекс
  • 2. О чем поговорим • Почему сложно показать много точек на карте, обзор решений • Как отрисовать большое количество меток на клиенте • Загрузка меток по требованию • Организация хранения и обработки данных на сервере
  • 3. Почему сложно хорошо показать много меток на карте?
  • 4.
  • 5.
  • 6. Решаем задачу «в лоб» Сервер page.html
  • 7. 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>
  • 9. X 50 000 page.html
  • 10. Очевидные недостатки • page.html весит несколько Мб и страница долго загружается • Мы передаем на клиент слишком много данных • Мы рисуем на клиенте данные, которые пользователь может не видеть
  • 11. Что предлагалось пользователям многие годы?* *Не только в API Яндекс.Карт
  • 12. Решение №1 – активные области
  • 13. Решение №1 – активные области
  • 14. Решение №1 – активные области Плюсы Минусы Очень быстрый рендеринг на клиенте Оооочень сложная серверная часть Передаются только данные для видимой области Клиентская картинка абсолютно статична
  • 15. Решение №2 - кластеризатор
  • 16. Решение №2 – кластеризатор Плюсы Минусы Просто использовать Клиент тратит время на кластеризацию Дизайн определяется и настраивается на клиенте Не решена проблема оптимальной загрузки данных
  • 17. Решение №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
  • 18. Решение №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 Лишние программные инициализации
  • 19. Что нужно в идеале? • Никаких лишних инициализаций на клиенте • Запрашиваем данные пачками асинхронно • Передаем на клиент только данные, которые видит пользователь • Рисуем на клиенте только данные, которые видит пользователь
  • 20. Что мы сделали для клиентской оптимизации
  • 21. Храним только данные • Все данные хранятся как их JSON- описания в специальном менеджере • Программные сущности создаются только при необходимости нарисовать объект
  • 22. 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 Храним только данные
  • 24. Balloon Hint Editor Options Events Overlay …
  • 25. Balloon Hint Editor Options Events Overlay …
  • 26. Balloon Hint Editor Options Events Overlay …
  • 27. Balloon Hint Editor Options Events Overlay … Компонент, отвечающий непосредственно за отрисовку на карте
  • 28. ObjectCollection Balloon Hint Editor Options Events … Overlay Overlay Overlay
  • 29. Получился ObjectManager • Хранит данные и не создает программные сущности без надобности • Мы вынесли всю инфраструктуру в общую коллекцию, в метках оставили только самое нужное https://clck.ru/9LqPp
  • 30. Время добавления на карту меток с кластеризацией 6000 5000 4000 3000 2000 1000 0 1000 10000 50000 ObjectManager Placemarks
  • 31. Поговорим про загрузку данных с сервера на клиент
  • 34. Минусы подхода • На малейший сдвиг нужно генерировать новый запрос • Многократная загрузка одних и тех же данных • Запросы всегда разные, непонятно, как кешировать
  • 36. Видимая область карты Тайлы в видимой области
  • 37. Загружаем данные потайлово • Данные загружаются всегда по одним и тем же областям – легче организовать кеширование • Запоминаем, какие тайлы подгружены, а какие нет • Небольшой сдвиг карты не вызывает дозагрузку
  • 38. RemoteObjectManager, LoadingObjectManager • Следят за видимой областью карты • Следят, какие данные загружены, а какие еще нет • Отправляют потайловые запросы за данными на сервер clck.ru/9Lp2J clck.ru/9Lp2S
  • 39. LoadingObjectManager Загружает метки и кластеризует на клиенте RemoteObjectManager Отвечает за загрузку и отображение результатов серверной кластеризации
  • 43. Генерация статических файлов • Не требует сервера, отвечающего на запросы клиента • Файлы могут занять очень много дискового пространства • Нужен скрипт, генерирующий эти файлы с некоторой периодичностью • Очень примитивное решение, подойдет для небольших демо-проектов
  • 44. Пространственные базы данных • MySQL – SPATIAL • PostgreSQL – PostGIS • Oracle • MongoDB • …
  • 45. Поговорим про серверную кластеризацию точек
  • 46. Кластеризация на клиенте Сервер Клиент Формирование списка точек Передача на клиент Кластеризация Отображение результата Кластеризация Отображение результата Кластеризация Отображение результата
  • 47. Кластеризация на клиенте Сервер Клиент Формирование списка точек Передача на клиент Кластеризация Отображение результата Кластеризация Отображение результата Кластеризация Отображение результата
  • 48. Кластеризация на сервере Сервер Клиент Формирование списка точек Кластеризация Передача на клиент Отображение результата Отображение результата Отображение результата
  • 49. Серверная кластеризация. v1 БД Кластеризация Отправка на клиент
  • 50. Серверная кластеризация. v1 SELECT Id, long, lat, FROM bigTable WHERE latLon in bounds 1. Получаем данные для тайла из базы 2. Кластеризуем любым алгоритмом 3. Отправляем ответ на клиент
  • 51. Серверная кластеризация. v1 Плюсы Минусы Можно выбрать любой алгоритм кластеризации Чем красивее алгоритм, тем дольше он работает Нужно хорошо организовать кеширование ответа
  • 53. Серверная кластеризация. v2 БД Отправка на клиент Данные, сгруппированные по grid-кластерам
  • 54. Серверная кластеризация. 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 gridY FROM bigTable WHERE latLon in bounds GROUP BY gridX,gridY Вместе с выборкой объектов сразу объединяем объекты в grid-кластеры
  • 55. Серверная кластеризация. v2 Плюсы Минусы Не надо писать дополнительной логики по кластеризации Grid-кластеризация не самая красивая Быстро работает Ваша база данных вечно считает, вы не используете индексы
  • 58. «Quadkey» tileX = 3 = 0112 tileY = 5 = 1012 quadkey = 1001112 = 2134 = “213” Используем битовые маски для выборки объектов в тайле zoom = 1, mask = 110000 zoom = 2, mask = 111100 …
  • 59. Серверная кластеризация. v3 БД Отправка на клиент Данные, сгруппированные по grid-кластерам + quadkey для каждой точки
  • 60. Серверная кластеризация. v3 SELECT MIN(id) AS minId, COUNT(id) AS count, AVG(long) AS long, AVG(lat) AS lat FROM 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|0000000 Q2 : 320132321|3333333 free:333333333|3330000 (+3 зума, кластер 32х32)
  • 61. Серверная кластеризация. v3 Плюсы Минусы Очень быстро Grid-кластеризация не самая красивая Нужно заранее насчитать Quad-коды
  • 62. Поговорим про кеширование и версионирование данных
  • 63. С кешированием все просто • Поскольку запросы всегда потайловые, кешируем ответ сервера для тайла на определенном зуме • Пишите данные в файлы, используйте Memcached, Redis и тд • Если запрос поступает для большой тайловой области, разбиваем его на отдельные тайлы и собираем ответ из кеша потайлово
  • 64. Опасный момент – обновление данных
  • 65. Опасный момент – обновление данных
  • 66. Опасный момент – обновление данных Загружены данные старой версии Сюда могут подгрузиться данные уже новой версии
  • 67. Закладываем версионирование в архитектуру • Передаем на клиент версию данных • Клиент всегда отправляет запросы с указанием версии данных • Храним несколько последних версий на сервере • Системы кеширования тоже завязываем на версию • Если нужно, продумываем автообновление версии на клиенте
  • 68. Полезные ссылки • Работа с большим количеством объектов – clck.ru/9Lp2e • Если есть вопросы, пишите в клуб – clubs.ya.ru/mapsapi/
  • 69. Спасибо за внимание! Марина Степанова, руководитель группы разработки API Яндекс.Карт mstepanova@yandex-team.ru