如何通过打开无数标签的用户来解决服务器泛滥问题?

时间:2012-07-11 18:12:07

标签: php ajax

我有一些聊天/论坛应用程序,它使用jquery ajax使用定期轮询(每15秒)检查新消息。我想知道我是否可以通过加载几个相同的浏览器实例(包含大量选项卡)来解决那些试图“有趣”的用户问题,这些实例都指向同一个应用程序。每个选项卡都发送一个ajax请求,如果有多个用户开始做同样的事情,它可能会溢出服务器。

我会在一个表中存储会话,以及最后的访问时间和IP地址,只要用户不使用相同的浏览器,它就能正常工作。我可以存储使用ajax POST或GET请求发送的唯一标识符,但如果常规(非滥用)用户刷新其页面,则会产生问题,然后会创建新的标识符。

这还不是一个真正的问题,但是在有人想到这样滥用系统之前更好地抓住它:)不知道怎么做?

4 个答案:

答案 0 :(得分:2)

一个选项可能是获取数据:

  • 您的脚本正准备轮询数据。在执行请求之前,写入(使用LocalStorage),表示您要获取数据的值。 localStorage.setItem("last-request-timestamp", new Date().getTime());
  • 轮询数据。你得到一个结果。将该结果写入localStorage:localStorage.setItem("latest-messages", ajax_result);
  • 通过检查localStorage.getItem("last-request-timestamp")是否超过15秒,检查网页是否准备轮询数据。如果是,请转到步骤1.如果不是,请等待15秒再次检查。
  • 无论当前页面是否轮询数据,请检查latest-messages变量并更新页面。

其他页面当然会共享localStorage数据。如果此时正在提取另一个页面,他们将无法获取数据。如果页面#1关闭,则其他页面之一将继续获取数据。

之前我没有使用过LocalStorage,但浏览器支持看起来不错。您还应该能够将其用作键值数组:localStorage["last-request-timestamp"]

您只能在localStorage中存储字符串,但您当然可以将其序列化为JSON。

答案 1 :(得分:0)

我有类似的问题。现在我强制所有用户登录(这意味着我有他们的电子邮件)。另外我设置每个帐户的连接限制和每个连接的请求限制,在5次溢出后我要求用户输入验证码,然后我阻止帐户30分钟并发送带有密码恢复链接的电子邮件。这不是一个明确的解决方案,但现在它对我有用。

<强> UPD:

最简单的方法是使用cookie或会话存储。我用饼干。算法很简单:

  1. 用户在网上登录。
  2. 检查此用户是否有任何已打开的会话, 打开,然后删除其他会话或触发异常或 切换到该会话,您已决定自己所需的 行为。
  3. 为用户创建会话ID并将其存储在数据库中。
  4. 增加特定用户的会话计数器字段以检测已打开 会话,所以现在使用一个浏览器并不重要 或许多。
  5. 更新最后一个访问标记(我使用microtime(true) + $delay和mysql decimal(14,4))。发送给用户
  6. 将ID发送给客户
  7. 在每个请求上:

    1. 按$ _COOKIE中传递的ID搜索会话。
    2. 检查上次访问标记。如果它小于microtime(true)则意味着客户端频繁发送请求,因此决定自己该做什么,增加标记,例如microtime(true) + $delay + $penalty或丢弃整个会话或触发错误。行为取决于您的应用程序。

答案 2 :(得分:0)

不确定它是否可以在javascript中执行。您可以检查选项卡是否处于活动状态。并且只在活动标签上执行ajax?

答案 3 :(得分:0)

为什么不在问题上抛出像Memcached / Redis这样的东西?缓存10-15s生命周期的响应并避免尽可能多的处理。