假设我有一个拥有1亿会员的网站,任何时候都有大约500,000名用户登录。网站使用Linux / Apache / PHP / MySQL。我想在主页上显示一个徽章,显示在线用户总数 - 每分钟更新一次。当访问者点击它时,它应该显示哪些用户在线的列表。
我考虑过一个每60秒调用一次PHP / MySQL文件的AJAX脚本,它会更新用户的“Last_Activity”字段成员表。问题是这将导致每60秒一次500,000次MySQL Update查询。
有更好更简单的方法来更有效地完成这项工作吗?大型网站如何做到这一点?任何回复都将不胜感激。
答案 0 :(得分:3)
一个简单的解决方案是将登录用户的数量存储在ajax请求提取的文本文件中,然后每分钟一次的cronjob可以更新此文本文件。
这也将减少每分钟Ajax请求的开销,因为它们不会在服务器上调用PHP(也不会产生另一个MySQL连接)。
答案 1 :(得分:1)
这是广大用户。您可能至少有50个负载平衡的Web服务器处理此流量,以及一个用于处理当前用户会话的大型专用分布式数据处理系统。正如其他人所提到的,将此问题提交给您的运营团队。
这是一个足够多的用户,您可以在报告在线用户时出现相当大的不准确性,而且您的用户也不会更聪明。
如果我是你,我仍然想使用MySQL,我会在DBMS的每个分片中创建一个active-users表。此表将具有索引session_expiration
时间戳。每次我从每个用户那里听到我都会这样做。
UPDATE active
SET session_expiration = NOW() + INTERVAL 5 MINUTE
WHERE user_id = (the user you're hearing from);
如果用户明确注销,请删除active
行。如果他们只是走开,他们的会议将在五分钟后到期。
每五分钟左右,我会用MySQL event来做这些事情。
DELETE FROM active WHERE session_expiration <= NOW();
UPDATE count SET active_count = (SELECT COUNT(*) FROM active);
count
是一行表。
然后,当您需要在线查找用户数时,您将查询该表。如果你想给出动态的幻觉,可以从表中的值中加上或减去一个小的随机数。
关键是利用这样一个事实,即有50万用户,你不必在任何给定的时间内准确地准确在线数字。这很好,因为无状态的基于HTTP的系统不允许这种精度。
不要仅仅为了更新用户会话而执行AJAX帖子所涉及的额外工作,当然也不是每分钟一次。更新会话是用户做一些有趣事情的副作用。
在此期间,请阅读YAGNI。在获得用户之前花时间研究可扩展性是错误的。你最好花时间开发能吸引这些用户的功能。
答案 2 :(得分:0)
您真的不需要500k用户的更新查询。当用户与您的网站进行互动时,您的用户的上一个活动字段应该会更改,例如重新加载页面,导航到新页面,发送消息。