带有node.js的可扩展推送应用程序
我正在考虑编写一些web应用程序,它们的需求几乎与聊天室相同。我希望它们能够很容易地扩展 我曾经使用过node.js,我了解它如何帮助设计推送应用程序,但在考虑让它们在多台服务器上运行时,我遇到了一些困难 下面是一些我可以想到的大型聊天应用程序的设计: 1-服务器有状态,它们保持连接打开,客户端可以向它们推送新消息。在这种情况下,我们受到一台服务器的物理内存的限制,因此如果每个房间有太多用户,我们就无法线性扩展 2-服务器没有状态,它们请求一个分布式数据库来响应客户端的请求。在此场景中,客户端轮询服务器。我们可以线性扩展,但吞吐量会降低,消息不会立即传递,并且在扩展时轮询被视为一种不好的做法 3-混合1和2。服务器保持其客户端的连接处于打开状态,并轮询分布式数据库。应用程序编写起来更复杂,我们仍然使用轮询。类似的客户机请求(同一房间的客户机)只是由服务器分组为一个请求。代码变得不必要且复杂,在我们有很多房间,每个房间只有几个用户的情况下,代码无法扩展 4-服务器没有状态,数据库集群使用事件将新消息通知每个注册的服务器。这是我想要的解决方案,但我还没有听说过任何数据库具有此功能。(有些人在这里谈论mongodb的这个特性:) 那么,为什么第四种解决方案今天没有被广泛使用呢带有node.js的可扩展推送应用程序,node.js,mongodb,nosql,Node.js,Mongodb,Nosql,我正在考虑编写一些web应用程序,它们的需求几乎与聊天室相同。我希望它们能够很容易地扩展 我曾经使用过node.js,我了解它如何帮助设计推送应用程序,但在考虑让它们在多台服务器上运行时,我遇到了一些困难 下面是一些我可以想到的大型聊天应用程序的设计: 1-服务器有状态,它们保持连接打开,客户端可以向它们推送新消息。在这种情况下,我们受到一台服务器的物理内存的限制,因此如果每个房间有太多用户,我们就无法线性扩展 2-服务器没有状态,它们请求一个分布式数据库来响应客户端的请求。在此场景中,客户端轮
在这种情况下,人们通常是如何设计他们的应用程序的?因为您想要一个推送应用程序,您可能会使用Redistore 通过使用这种组合,所有连接的数据都保存在Redis(内存数据库)中,因此您可以在进程之外进行扩展。Redis的另一个用途是pub-sub 其思想是在需要推送某些内容时触发事件,然后使用Socket.io向浏览器发送消息。如果您想收听数据库更改,也许最好使用 资源:
因为您想要一个推送应用程序,所以可能需要与Redistore一起使用 通过使用这种组合,所有连接的数据都保存在Redis(内存数据库)中,因此您可以在进程之外进行扩展。Redis的另一个用途是pub-sub 其思想是在需要推送某些内容时触发事件,然后使用Socket.io向浏览器发送消息。如果您想收听数据库更改,也许最好使用 资源:
您可能希望挂接MongoDB复制,而不是案例4的触发器 让我们假设你有一个(你不会运行一个mongod,是吗?) 每次更改都会写入主服务器上的,然后复制到辅助服务器上 您可以使用从oplog高效地获取新更新。注意,这仍然是拉动,而不是推动
然后node.js会将这些事件推送到客户端。您可能希望挂接MongoDB复制,而不是案例4中的触发器 让我们假设你有一个(你不会运行一个mongod,是吗?) 每次更改都会写入主服务器上的,然后复制到辅助服务器上 您可以使用从oplog高效地获取新更新。注意,这仍然是拉动,而不是推动
然后node.js会将这些事件推送到客户端。Oh!感谢这些链接,我不知道CouchDB和Redis有这个功能,我主要使用MongoDB,但我可能会切换到其中一个:)每个db都有它自己的用途,Redis适合快速、内存数据、发布子和队列功能;CouchDB在复制、数据安全和更改方面非常出色;MongoDB在速度方面真的很强大,以比常规map reduce等更“友好”的方式进行查询。当然:)但MongoDB仍然可以从这一功能中获益哦!感谢这些链接,我不知道CouchDB和Redis有这个功能,我主要使用MongoDB,但我可能会切换到其中一个:)每个db都有它自己的用途,Redis适合快速、内存数据、发布子和队列功能;CouchDB在复制、数据安全和更改方面非常出色;MongoDB在速度方面真的很强大,以比常规map reduce等更“友好”的方式进行查询。当然:)但MongoDB仍然可以从这一功能中受益。我相信可定制游标只在插入新文档时有效,不是吗?如果我想知道更新(比如将消息作为数组存储在文件室文档中),该怎么办?不,您也可以获得更新。这就是复制的工作原理。每次写入都会在oplog中结束,并且不必使用可定制的游标。你可以用普通的。但是它的效率会更低。好的thx的建议,我会看看oplog是如何工作的,这应该是有趣的,但我可能会切换到另一个DB,提出一个开箱即用的解决方案:)我相信可定制的游标只在插入新文档时有效,不是吗?如果我想知道更新(比如将消息作为数组存储在文件室文档中),该怎么办?不,您也可以获得更新。这就是复制的工作原理。每次写入都会在oplog中结束,并且不必使用可定制的游标。你可以用普通的。但是效率会降低。好的,thx的建议,我会看看oplog是如何工作的,这应该很有趣,但我可能会切换到另一个DB,提出一个开箱即用的解决方案:)