0

我认为您可以打开的 mysql 连接数量是有限制的。是否有一种方法可以暂时存储来自用户的数据,然后一次性将其插入数据库?或者你会如何管理 200 000 人进行 Facebook 状态更新?(因为我不能简单地打开 200k 连接并将信息放入。)

谢谢。

4

1 回答 1

1

例如,您可以使用队列,从而单个进程获取 INSERT(通过进程间通信或通过套接字,即使 - 在这种情况下 - 您将有 200.000 个到队列服务器的连接,或者通过将文件存储到“假脱机“ 目录)。

然后该进程“收获”队列,可能在 MySQL 的情况下使用扩展语法合并 INSERTS,并将它们发送到数据库。

这仅在将 INSERT 外包给进程的整个工作比将其发送到 DB 快得多的情况下才有用,否则会产生成本和问题(例如,在外包之后,Web 服务器认为 DB 已更新,但实际上不是,在收割者得到它之前不会有(一点点?)时间)超过好处。

如果 reaper 进程能够在过载的情况下限制或停止 Web 服务器,则可以使整个进程更具弹性:即,假设 MySQL 只能处理每分钟持续 X 次插入,即使使用 INSERT DELAYED 等,并且入境率远不止于此。然后在每次迭代中,reaper 进程会注意到队列越来越长。超过给定的限制,该进程可能会设置一个标志,以便新用户收到错误消息并阻止生成进一步的插入。

在入站 > 出站的情况下,无论如何都会给出一些东西,所以至少这样可以保护现有连接并提供“软故障”模式。

您还可以使用共享内存实现本地缓存:每个 PHP 进程将 INSERTS 放置在共享内存中(使用锁定!)。如果有超过 X 个元组在等待,或者如果旧元组的时间超过 Y 秒,则所有元组都合并在一个单独的 INSERT 中,该 INSERT 被发送到 MySQL,并且缓存被清空。这样整个过程非常轻量级,不使用网络(但有一点内存),并且 MySQL 上的负载明显减少 - 合并的 INSERT 可以比单独的 INSERT 快 100 倍,并且还可以使用索引禁用/启用技巧。

于 2012-07-06T13:47:12.493 回答