簡體   English   中英

MySQL - 多個並發更新

[英]MySQL - multiple concurrent updates

我為 Android-IOS 創建了一個基於位置的應用程序,我使用 NodeJS 作為我的后端。 我的用戶的位置每 X 秒更新一次,向 NodeJS 服務器發送 HTTP 請求。 假設我將有 10.000 個並發請求/秒來更新不同用戶的位置數據,MySQL 可以處理這個數量嗎? 還是會崩潰?

大概你會使用 MySQL 特定的 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 服務器就不會崩潰。 但是您的節點服務器可能會慢得不舒服,甚至內存不足。

如果您的應用程序擴展到 10K/sec 點,您可能需要考慮設置MySQL 集群 但是, YAGNI ,在您的應用程序擴展之前不要這樣做。 獲得數千名用戶需要一段時間。 與此同時,你的時間和金錢花在你的功能上比花在你的基礎設施上要好得多。 (當你有一兩個小時的空閑時間時,問我我是怎么知道這一點的。)

但是,還有更多的方法可以優雅地處理這種工作負載。

  1. 使用 nodejs 內置的固有排隊機制。 對於這些位置更新,請使用相當小的 MySQL 連接池。 當池中的所有連接都處於活動狀態時,節點將或多或少地自動將您傳入的位置報告 API 請求排隊。 這將允許您的服務器在獲得短暫的位置更新時優雅地減慢速度。

  2. 不要那么頻繁地記錄位置數據。 普通的 GPS 數據最多只能精確到幾米。 如果您的對象正在步行,他們至少需要幾秒鍾才能移動一米。

  3. 僅當您知道對象的手機移動超過一定距離時才更新數據庫。 最好的方法是在你的應用程序中。 使其僅在主體移動了一定距離時才報告新位置。 這樣您就可以避免固定主題的重復更新。 這將為手機節省大量電量。

  4. 隨着您的更新,還會以度/秒為單位發送時間戳和運動矢量。 並且,僅當位置或運動矢量發生顯着變化時才發送它。 您的更新可能如下所示:

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

然后,如果您需要猜測對象的當前位置,則可以將向量乘以時間差並將其添加到該位置。 如果您的拍攝對象正在快速移動(飛機、火車和汽車)並且您需要在后端准確猜測它們的位置,這將非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM