MySQL - несколько одновременных обновлений - PullRequest
0 голосов
/ 07 февраля 2020

Я создал приложение на основе местоположения для Android - IOS, и я использую NodeJS для своего бэкэнда. Местоположение моих пользователей обновляется каждые X секунд с помощью HTTP-запроса на сервер NodeJS. Давайте предположим, что у меня будет 10.000 одновременных запросов / сек c, которые обновляют данные о местоположении разных пользователей. Может ли MySQL обработать этот том? Или это будет sh?

1 Ответ

0 голосов
/ 07 февраля 2020

Предположительно, вы будете использовать MySQL -specifi c SQL примерно так:

 INSERT INTO location (user_id,long, lat) VALUES (?, ?, ?)
 ON DUPLICATE KEY UPDATE long=?, lat=?;

на таблице с таким определением:

CREATE TABLE location (
 user_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
 long  FLOAT NOT NULL DEFAULT 0,
 lat   FLOAT NOT NULL DEFAULT 0,
 PRIMARY KEY (user_id)
);

Это, вероятно, самая простая таблица, которую вы можете использовать для этой цели. Если вам нужно выполнить поиск в таблице по местоположению, вам, вероятно, также понадобится этот индекс для поиска ограничивающих рамок.

 INDEX location_lat_long_user_id (lat, long, user_id)

Так что, как минимум, для каждого обновления MySql требуется доступ к user_id ключ, и, возможно, также потребуется обновить другой индекс.

Если вы поместите гораздо больше информации или больше индексов в эту таблицу, ваши вставки и обновления станут еще более сложными для обработки MySql.

10K этих транзакций в секунду - это очень большое число для одного MySQL сервера. Если вы правильно настроите пулы соединений с узлами, ваш сервер MySQL не будет обрабатывать sh. Но ваши серверы узлов могут замедляться из-за неудобств или даже из-за недостатка оперативной памяти.

Если ваше приложение масштабируется до 10K / se c, вы можете подумать о настройке MySQL кластер . Но, YAGNI , не делайте этого, пока ваше приложение не масштабируется. Требуется время, чтобы получить тысячи пользователей. В то же время ваше время и деньги гораздо лучше расходуются на ваши функции, чем на вашу инфраструктуру. (Спросите меня, откуда я это знаю, когда у вас есть час или два, чтобы сэкономить.)

Но есть еще несколько способов изящно справиться с такой нагрузкой.

  1. Используйте встроенные механизмы организации очередей, встроенные в nodejs. Для этих обновлений позиции используйте довольно маленький пул соединений MySQL. Когда все соединения в пуле активны, узел более или менее автоматически ставит в очередь ваши входящие запросы API отчета о положении. Это позволит вашему серверу изящно замедляться, когда он получает короткие всплески обновлений позиции.

  2. Не записывайте данные о положении почти так часто. Обычные данные GPS в лучшем случае точны только на пару метров. Если ваши объекты ходят, им понадобится как минимум пара секунд, чтобы пройти один метр.

  3. Обновлять базу данных только в том случае, если вы знаете, что трубки ваших субъектов переместились более чем на определенное расстояние. Лучший способ сделать это в вашем приложении. Заставьте его сообщать о новом местоположении только тогда, когда объект переместился на определенное расстояние. Таким образом вы избежите повторяющихся обновлений от стационарных тем. Это позволит сэкономить много энергии на телефонах.

  4. С вашими обновлениями также отправляются временная метка и вектор движения в градусах / секундах. И отправляйте его только тогда, когда значительно изменяется либо положение, либо вектор движения. Ваши обновления могут выглядеть следующим образом:

     time        long       lat           dlong      dlat
    1581106542  -73.98508   40.74780    -0.0004     -0.0005
    

Тогда, если вам нужно угадать текущую позицию для вашего объекта, вы можете умножить вектор на разницу во времени и добавить его в позицию , Это очень поможет, если ваши объекты движутся быстро (самолеты, поезда и автомобили), и вам нужно точно угадать их положение на бэкэнде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...