【问题标题】:Scalable push application with node.js使用 node.js 的可扩展推送应用程序
【发布时间】:2012-01-29 10:57:41
【问题描述】:

我正在考虑编写一些与聊天具有几乎相同要求的 Web 应用程序。而且我希望它们能够轻松扩展。

我使用过 node.js 并了解它如何帮助设计推送应用程序,但在考虑让它们在多个服务器上运行时我遇到了一些困难。

以下是我能想到的大型聊天应用的一些设计:

1 - 服务器有状态,它们保持连接打开,客户端可以将新消息推送给它们。在这种情况下,我们受到一台服务器的物理内存的限制,因此如果每个房间的用户过多,我们就无法线性扩展。

2 - 服务器没有状态,它们请求分布式数据库来响应客户端请求。在这种情况下,客户端轮询服务器。我们可以线性扩展,但吞吐量会降低,消息不会立即传递,并且在扩展时轮询已被证明是一种不好的做法。

3 - 1 和 2 的混合。服务器保持其客户端的连接打开并轮询分布式数据库。该应用程序编写起来更复杂,我们仍然使用轮询。类似客户端的请求(同一个房间的客户端)只是由服务器组合成一个单独的请求。代码变得不必要的复杂,并且在我们有很多房间和每个房间有几个用户的情况下无法扩展。

4 - 服务器没有状态,数据库集群使用事件通知每个注册的服务器有新消息。这是我想要的解决方案,但我还没有听说过任何具有此功能的数据库。 (有些人在这里谈论mongodb的这个功能:https://jira.mongodb.org/browse/SERVER-124

那么为什么今天没有这么多使用第 4 种解决方案呢?

在这种情况下,人们通常如何设计他们的应用程序?

【问题讨论】:

    标签: node.js mongodb nosql


    【解决方案1】:

    您可能希望挂钩到 MongoDB 复制,而不是案例 4 的触发器。

    假设您有一个replica set(您不会运行单个 mongod,对吗?)。

    每个更改都会写入主服务器上的oplog,然后复制到辅助服务器。

    您可以使用tailable cursors 有效地从 oplog 中提取新更新。请注意,这仍然是拉,而不是推。

    然后你的 node.js 会将这些事件推送到客户端。

    【讨论】:

    • 我相信可尾游标只在插入新文档时才有效,不是吗?如果我想知道更新(比如将消息作为数组存储在房间文档中)怎么办?
    • 不,您也可以获得更新。这就是复制的工作原理。每次写入都以 oplog 结尾。
    • 而且您不必使用可尾游标。你可以使用普通的。但效率会降低。
    • 好的,谢谢你的建议,我会看看 oplog 是如何工作的,这应该很有趣,但我可能会切换到另一个数据库,提出一个开箱即用的解决方案 :)
    【解决方案2】:

    由于您想要一个推送应用程序,您可能会将Socket.IO 与 RedisStore 一起使用。

    通过使用这种组合,所有连接的数据都保存在 Redis(内存数据库)中,因此您可以在进程之外进行扩展。这里 Redis 的另一个用途是用于发布订阅。

    这个想法是在需要推送某些内容时触发一个事件,然后使用 Socket.io 向浏览器发送一条消息。如果你想监听数据库的变化,或许使用CouchDB with it's _changes feature会更好。

    资源:

    https://github.com/dshaw/talks/tree/master/2011-10-jsclub/sample-app
    http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html
    How to reuse redis connection in socket.io?

    【讨论】:

    • 哦!感谢您的链接,我不知道 CouchDB 和 Redis 有这个功能,我主要使用 MongoDB,但我可能会切换到其中一个 :)
    • 每个数据库都有自己的用途,Redis 擅长快速、内存数据、发布订阅和队列功能; CouchDB 非常适合复制、数据安全和_changes; MongoDB 在速度方面非常强大,以比常规 map-reduce 等“更友好”的方式进行查询。
    • 当然 :) 但是 MongoDB 仍然可以从这个特性中受益
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 2017-01-16
    • 2016-08-22
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多