繁体   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