【问题标题】:Socket.io for real time application用于实时应用的 Socket.io
【发布时间】:2011-09-23 01:24:50
【问题描述】:

所以我有几个月前建立的另一个项目。它目前使用 jquery 和 ajax 并每 30 秒调用一次 php 脚本。 php 脚本查询 mysql 并将结果传回显示。在此应用程序中,该人能够从数据库中添加/编辑/删除记录,并且当他们这样做时,数据库中的结果列表需要更新他们看到的列表。到目前为止,它似乎可以完成这项工作,但展望未来,数据库会变得更大,并且需要更多的实时性,这意味着不仅每 30 秒刷新一次,而且尽可能即时。

socket.io 会是这个问题的答案吗?我是否可以简单地将 socket.io 与 nodejs 一起使用来创建服务器并发出事件来查询我的数据库并返回结果以显示?然后在客户端只有一个函数像每秒一样调用服务器套接字脚本?那是使用 socket.io 的正确途径吗?如果是这样的话,如果我每秒运行一次关于服务器资源的进程,会不会有问题?

【问题讨论】:

    标签: jquery ajax node.js websocket socket.io


    【解决方案1】:

    socket.io 会是这个问题的答案吗?

    我的回答是,socket.io / node.js 在处理实时应用程序方面比当前形式的 PHP 要好得多。

    然后在客户端只有一个 调用服务器套接字的函数 像每秒一样的脚本?

    在 node.js 中,您不应该轮询询问信息,而是应该将信息推送给您(使用 redis pubsub 或 node.js 事件)给您。我建议您在 stackoverflow.com 上查看我的 a pubsub snippet 以稍微解释一下自己。要使代码正常工作,您需要安装 socket.io 0.6.x(0.6.18),因为最新的 socket.io 0.7.x 的 API 略有不同。

    如果是这样,是否会担心 这个过程如果我每秒运行一次 关于服务器资源?

    就像我之前所说的使用 pubsub 语义。例如,您可以使用:

    【讨论】:

    • @Alfred 这就是我感到困惑的地方。所以你说我不需要在客户端或服务器端每隔一段时间运行一个脚本?我可以在服务器端设置它,它只在有更新时推送数据?假设在数据库中添加或删除了一行,可以设置脚本来检测这一点并推送到客户端而不使用 setinterval 之类的东西?
    • @John 这正是我要说的:)。您应该从提供的 cli 中使用 Redis 的 pubsub 以查看它的运行情况。当数据库发生变异时,您将更改发布到感兴趣的所需频道...
    • @Alfred 我正在阅读您的示例,我相信我理解它,有点。基本上我会为他们订阅一个频道,我的问题是什么是频道,我将如何创建频道来执行查询数据库并返回结果之类的操作?或者这不是一个频道?
    • 在我上面发布的redis pubsub => redis.io/topics/pubsub 文章中,我想清楚地解释了(比我能做到的更好?)什么是 Pub/Sub。剩下的,我学习 redis 的方法是启动 redis-server 并运行几个 redis-cli 实例并使用它。在我看来,学习东西的最好方法是玩它,这就是为什么 redis + redis-cli 很棒。我还建议您阅读 Simon Willison 的教程 => simonwillison.net/static/2010/redis-tutorial
    • @Alfred 是的,我阅读了该页面,这让我大吃一惊。我想我还不明白。
    【解决方案2】:

    socket.io 会是这个问题的答案吗?我是否可以简单地将 socket.io 与 nodejs 一起使用来创建服务器并发出事件来查询我的数据库并返回结果以显示?然后在客户端只有一个函数像每秒一样调用服务器套接字脚本?那是使用 socket.io 的正确途径吗?如果是这样,如果我每秒运行一次关于服务器资源的进程,会不会有问题?

    如果你想要实时的东西。结构可能不同。

    首先你需要一个中间人来帮助你在浏览器和服务器之间进行通信。

    解决方案 1:每 30 秒请求一次以获取实时(与您当前的方法相同)

    解决方案 2:http 流。一旦向服务器发出请求。服务器可以继续向浏览器发送响应。由于许多安全浏览器问题,socket.io 应运而生。 Socket.io提供了很多方法流,htmlfile流,xhr请求,flash...

    其次,您需要服务器接受连接并进行长轮询服务。感谢上帝 ! socket.io 已经为你完成了这部分。

    第三,最重要的人!那是数据。

    解决方案 1:每个请求/触发器调用 db 或 nosql 数据库(SQLserver、mysql、Mongodb)。相信我 !你的数据库很快就会死掉。

    解决方案 2:消息服务。 Redis pub/sub、rabbitQ 等服务。它只是在队列中使用订阅和发布消息。它使用特定的协议来发布消息,并且它们没有像 db 那样存储消息。所以它可以发送消息 >100 k 请求/秒!超级快。哇!是否使用此服务可以解决实时解决方案?不幸的是,这有点难。为什么 ?因为使用这种服务你不能存储数据,SQL查询来定制你的数据需要。

    解决方案 3:内存中的进程。Redis,memcached。内存超级快!您可以将最终显示结果存储在内存中。内存可以达到 >100 k 请求/秒。

    结论。构建一个真正的实时 Web 应用程序,如 facebook 或 tweeter。我们需要应用上述所有解决方案+一些作弊。例如,Facebook 好友通知。当您收到朋友消息更新时,它会使用消息服务向所有朋友(最多 5000 人)发布警报。因为大量发布会降低消息性能。之后缓存(Memcached)通知消息以减少调用db(mysql)。我们可以得到超过 100 万人的群消息怎么样?当然,我们不会向超过 100 万人发布。但我们要求 100 万人调用我们存储在内存中的最新群组消息。

    • 提醒:扩展服务器对于实现实时目标很重要。祝你好运!

    【讨论】:

    • 我正在构建一个用于分析的报告实时应用程序。我的应用程序将与 mysql 数据库交互以分析数据,并在我的应用程序上显示一些功能,例如分析用户注册/登录/聊天/通话的数量,然后显示在 dashbroad 视图上。如何使用 socket.io 做到这一点?有什么建议吗?
    猜你喜欢
    • 2011-04-22
    • 2011-09-23
    • 2013-05-30
    • 2013-08-16
    • 1970-01-01
    • 2021-01-22
    • 2018-12-19
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多