我有一组由 GUI 用于位置和内容的数据,并且该位置也存储在 MySQL 中。每次数据发生变化,也会反射(reflect)在服务器上。
然后,如果我想像jquery(或javascript,我不知道)一样频繁地更新MySQL,跟踪“mousemove” Action ,也就是说,向服务器发送请求,每次“mousemove”都会更改MySQL中的值,它有多“重”,特别是当多个用户使用同一服务器时?
什么是更好的解决方案?我正在考虑等待 3 秒直到 Action 完成,然后如果没有更多 Action ,则向服务器发送请求。
虽然很多人不使用我的服务器,但这总是让我担心并阻碍我的进步。请帮忙。
最佳答案
最好有一个中间内存解决方案来减少数据库调用的数量。例如。 Memcached
。但!但!在我们开始之前,让我们先了解一些数字。
那么我们来算一下,好吗?
您想要跟踪事件的详细信息。
| Action to be recorded | Frequency of Occurrence | Per user/minute avg. |
|:---------------------------:|:------------------------:|:--------------------:|
| 1. MouseMove!!! (Seriously?)| Very Heavy!!!| 200|
| 2. Clicks (MouseDown) | Medium to High| 10|
| 3. Hover (MouseOver) | High| 50|
因此,对一个活跃用户进行非常粗略的估计,特定 session 触发的总事件
将为260/每分钟
。
因此,假设 10 个并发用户
,您的每分钟事件数变为 2600
。
这将成为对您自己的服务器进行 DDoS 攻击的可靠方式。
一些有用的提示。
尝试批量记录事件,即。记录客户端发生的事件,一旦超过阈值,就向服务器发送请求以记录该批处理。
不要使用主应用程序服务器进行此类日志记录,因为这就是——等等——日志记录,并且您应该使用单独的服务器来维护日志。
- 如前所述,在服务器上也应先在内存中存储日志,然后再将日志推送到数据库。
- 这些数据不需要甚至需要存储在
关系数据库
中。几乎所有大公司都使用扁平数据库
(NoSQL
)来存储此类信息。 - 如果您仍然决定继续使用
关系数据库
,则在执行INSERT
时使用事务
。 - 如果仅对登录用户进行跟踪,并且专用内存缓存对您来说不可行,您可以将跟踪数据存储在用户 session 中,并在达到阈值后再次将记录移至数据库.
关于javascript - 'heavy' 是如何在服务器上每隔几秒运行一次mysql命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37976315/