LINUX.ORG.RU

Aрхитектурное решение для хранения и работы с данными геокоординат при высоких нагрузках?

 ,


0

2

Всем доброго времени суток!

Я участвую в разработке высоконагруженной системы, значительную часть данных которой составляют географические координаты (пара latitude, longitude, в градусах, точность - 0.00001 градуса).

Проект спроектирован по микросервисной архитектуре.

В системе есть несколько таблиц (сущностей), для которых организован gps-трекинг. Геокоординаты складываются в таблицы, ассоциированные с этими сущностями (тек. момент - 2). Запросов на добавление геокоординат- 5 млн/минуту, для каждой сущности.

Текущая задача, состоит в том, чтобы считать статистику по нескольким показателям, сгруппированных относительно геокоординат. Причем статистика должна иметь возможность фильтрации по всем полям (в том числе по геокоординатам, в том числе по радиусу в км, относительно искомой геокоординаты).

В данный момент, на каждый «отчет» статистики создана своя таблица. Базой выбрана PostgreSQL, с расширением PostGis. Для таблиц статистических «отчетов», назначены индексы GiST. Они позволяют быстро фильтровать геокоординаты относительно искомой геокоординаты (Index Scan). Данные в таблицах статистических «отчетов» пересчитываются по таймеру.

Нормально ли вообще текущее существующее решение. Можно ли с ним будет работать далее? Или пересчитывать что-то по таймеру, с такими объемами данных - очень плохо? Вообще альтернативы я не вижу, кэширование мне кажется, тут не подходит тоже.

узкое место - очевидно база. микросервисы можно спокойно выкинуть, их масштабирование все равно никакого профита не принесёт. базу шардировать. при необходимости - прикрутить к ней in-memory кэш, вроде того же coherence. таймер можно и оставить, хотя разумнее - свести время пересчитывания к минимуму за счёт того же шардирования и кэша и пересчитывать при обращениии

anonymous ()

Данные в таблицах статистических «отчетов» пересчитываются по таймеру

Всегда стараюсь такие вычисления делать «на лету». Т.е. формировать по мере поступления данных. Но не всякий алгоритм можно так преобразовать, конечно.

anonymous ()