0

我正在运行一个具有消息传递和通知功能的社交网络。每次用户发送消息或为另一个用户放置通知时,都会将一行插入到表 news_updates 中,其中包含有关消息或通知的详细信息,并将他的所有朋友插入到 news_seen 表中。(一旦阅读了消息,或者打开了与通知相关的项目,see 设置为 1,我将在我的 ajax 请求的回调函数结束时执行此操作 - 我正在收集所有 newsitem_ids新闻项目,当前打开,然后我正在做一个包含所有 newsitem_ids 的大插入)。

news_seen:

newsitem_id bigint, 
user_id big int,
seen int DEFAULT '0'

目前,我每 3 秒运行一次 ajax 请求,以检查 news_updates JOIN news_seen 中的新闻。

现在我得到越来越多的用户,结果证明这是一个巨大的服务器负载。我已经阅读了很多关于 xmpp 之类的内容,我认为推送通知服务对我的网站来说会很棒。

唯一的问题是,我真的无法决定走哪条路,因为有很多选择。

另外,我考虑过创建自己的系统。我打算这样做:

  • 在初始注册时为每个用户创建一个 xml 文件(并为已经注册的用户运行批处理)

  • 一旦用户发送新闻更新(我有自己的 php 函数将它们写入数据库),我会包含一个小命令来为各自的朋友操作 xml 文件

  • 我不会做我的 3sec ajax 请求,而是使用 jquery 流建立到 xml 文件的长连接,如果自上次请求以来进行了更改,我会做我通常的 ajax 请求,从数据库中轮询数据。

  • 我不是在 ajax 请求中运行我的 check_seen ,而是将所有新项目插入到一个全局数组中,供一个间隔函数使用,该函数测试当前是否正在查看列表中的任何项目。

你认为这是个好主意吗?

4

1 回答 1

1

老实说,我认为我不会实施您的规范。

  • 例如,我会使用比 XML 更轻的数据模型。我会改用 JSON。
  • 我会尽可能避免接触 DISC(数据库)(慢)。
  • 做两个请求而不是一个(长轮询/轮询)。我会尽量避免这种情况。
  • 我可能会尝试通过不使用间隔函数来避免浪费 CPU 时间,而只在需要时调用函数。我可能会使用REDIS 的 pubsub 之类的东西。
  • 由于阻塞 IO,轮询/长轮询(大多数时候)在 PHP 中是一个坏主意。我发现了一个名为REACT的有趣项目,我相信它可以实现非阻塞 IO(昂贵)。我自己没有测试过这个(性能),但这可能是一个选择。
  • 对于 XMPP,您必须安装其他软件。例如,我喜欢Prosody,因为它易于安装/使用。然后你需要看看BOSH。对于您的 bosh 客户端,我会使用strophe.jsJSJaC
  • I would probably use something like socket.io, Faye or maybe vertx.io instead, because it would scale a lot better.
于 2012-06-12T09:39:28.617 回答