2016-10-12 2 views
2

Я разрабатываю приложение, состоящее из сервера в node.js, в основном сокета, который слушает входящие соединения.Производительность socket nodejs + mysql

Данные, которые поступают на мой сервер, поступают из GPS-трекеров (30 приблизительно), которые отправляют по 5 записей в минуту каждый, поэтому через минуту a будет иметь 5*30 = 150 записей, через час у меня будет 150*60 = 9000 записей, в день 9000*24 =216000 и в месяц 216000*30 = 6.480.000 миллионов записей.

В дополнение к широте и долготе я должен хранить в базе данных (MySql) совокупную дистанцию ​​каждого трекера. Каждый трекер отправляет на серверные позиции, и каждый раз, когда я получаю данные, мне приходится вычислять км между 2 пунктами (чтобы уменьшить работу в базе данных, когда она содержит миллионы записей).

Вопрос в том, Каков правильный способ суммирования километров и его хранения?

Я думаю, что вся база данных не является решением, потому что в миллионах записей будет очень медленно. Может быть, каждый раз, когда я должен хранить новую точку (150 раз в минуту), могу ли я сделать выбор последней записи в базе данных, а затем суммировать накопленный километр с новым расходом?

+1

Вы можете использовать хранилище данных в памяти, такое как [Redis] (http://redis.io), чтобы сохранить кумулятивное расстояние. Это ключ -> хранилище значений, поэтому вы можете использовать идентификатор трекера для ключа, а затем использовать метод добавления, чтобы добавить новое расстояние к общей сумме. –

+0

Согласованный @DanielWaghorn мы используем комбинацию Redis и MongoDB на работе и имеем дело с 500 тыс. Записей в день. Redis - отличное решение для хранения данных ключа/значения, которые в противном случае были бы дорогими в db-запросе. В вашем случае вы будете вычислять расстояние между точками каждую минуту, а затем хранить эту сумму в качестве нового значения для этого конкретного ключа в вашем магазине redis. Redis является атомарным и синхронизирует любые записи с ним, как идеальный вариант использования для вашего проекта. Мы также создали задание cron, которое периодически записывает значение на диск в случае сбоев в redis store (еще не произошло) – Alex

ответ

0

2,5 вставки в секунду - это лишь скромная ставка. 6M записей/месяц - никаких проблем.

Как вы вычисляете KM? Вычислить расстояние предыдущего показания GPS до текущего? Или, может быть, к началу? Имейте в виду, что показания GPS могут быть немного шелушатся; автомобиль, идущий по прямой линии, может выглядеть пьяным при наложении каждые 12 секунд. Между тем, я предполагаю, что вам нужен какой-то индекс (датчик, последовательность), чтобы отслеживать предыдущее (или первое) показание, чтобы сделать расстояние.

Но что вы будете делать с расстояния? Он постоянно читается для показа где-нибудь? То есть, вы обновляете некоторые не-MySQL thingie 150 раз в минуту? Если это так, у вас есть приложение, которое должно получить новое чтение GPS, сохранить его в MySQL, прочитать начальную точку (или запомнить), вычислить kms и обновить график. То есть, MySQL здесь не в центре внимания, но ваше приложение.

Что касается представления lat/lng, я ссылаюсь на my cheat sheet, чтобы увидеть, что FLOAT может быть оптимальным.

Километры должны почти наверняка храниться как FLOAT. Это дает вам около 7 значащих цифр точности. Вы должны решить, будет ли значение представлять «метры» или «километры». (Точная точность.)

+0

Спасибо за ваш ответ. Я сделал несколько тестов с 20 M записей в моей базе данных, и запросы занимают всего 0,0003 сегмента. Я вычисляю KM между новой точкой и предыдущей. Мне нужны только километры для операций с бэкэнд, а не на визуальной карте. Somethings у меня проблемы, когда трекер остановлен.Например, трекер остановлен на 90 секунд, но я получаю много разных значений lat/lng с большой погрешностью (иногда я регистрирую 20-30 км, когда трекер не движется). Поэтому я пытаюсь сделать код, который отбрасывает позиции, когда скорость приближается к 0 км/ч. Что ты об этом думаешь? –

+0

В походе мои телефонные часы 0,5 км, пока я сижу, по-прежнему ест обед. Я думаю, что трюк заключается в том, чтобы спросить о неожиданных прогонах, таких как 100 км/ч от одного чтения к другому - одно или оба места ошибочны и/или что-то еще. И/или некоторый алгоритм сглаживания. Я не знаю, что физика - это случайное чтение «плохое», или все чтения «выключены»? (По моему опыту, это в основном последний. –

Смежные вопросы