Серверная часть для трекингового приложения. Как корректно сделать?
Добрый день !
Появилась необходимость сделать мобильное приложение, которое будет слать на сервер свое положение(трекер). Данные будут слаться "как только изменились", т.е. при движении постоянно, очень часто.
Возник вопрос, как сделать корректно серверную часть.
Проблемы, которые предвидятся:
Данные шлются много и постоянно. С другого приложения надо будет отслеживать перемещение "телефона-маячка", по этому складывать данные в sql таблицу в кучу, а потом забирать последнее положение - может оказаться слишком долго.
Придумалось решение - на одного "маячка" завести поле с текущими его координатами и обновлять.
Хотелось бы услышать мнение людей, которые с этим сталкивались. Может быть есть другие более корректные решение, какие-то специальные структуры и другие способы создания таких систем. Может стоит использовать не sql, а, скажем, mongoDB ? Или есть какой-то особый способ организации данных.
Первое. Для хранение координат, и их истории (т.е. банальная связка device_id:coords) смысла использовать RDBMS - ноль.
Только нереляционные базы данных. Монга, упомянутая, отлично подходит.
Я бы сделал отдельную таблицу\коллекциюс актуальным(последним) положением девайса и отдельную таблицу\коллекциюс историей координат по девайсам.
Таким образом для отображения текущего положения пользователя и\или проверки на то, изменил он своё положение или нет - смотрим последнее актуальное состояние по ключу, а для построения маршрутов и прочих историй требующих более одной точки - лезем в коллекцию с выборкой по оному.
Коллекция актуальных состояний всегда будет равна количеству трекаемых девайсов, а историю можно шардировать, партиционировать как душе угодно в зависимости от объемов данных.
Второе.
Как делать.
Ну, очередь на отправку на клиенте, ожидающая удачного коннекта и "запоминающая" последнее сочетание координаты + таймстэмп на последний синк с сервером.
Очередь на приём с последующей обработкой и перезаписью в базу на стороне сервера.
Ну, и система гарантированной доставки в режиме пинг-понг через сокеты.
На правильность не претендую, но я на мой взгляд это разумное соотношение сложность\качество.
Делается просто. Не на PHP.
Пока есть постоянный коннект с телефоном, последняя координата хранится в памяти.
В базу пишем не сразу, а пачками. Можно прореживать.