Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有node.js的可扩展推送应用程序_Node.js_Mongodb_Nosql - Fatal编程技术网

带有node.js的可扩展推送应用程序

带有node.js的可扩展推送应用程序,node.js,mongodb,nosql,Node.js,Mongodb,Nosql,我正在考虑编写一些web应用程序,它们的需求几乎与聊天室相同。我希望它们能够很容易地扩展 我曾经使用过node.js,我了解它如何帮助设计推送应用程序,但在考虑让它们在多台服务器上运行时,我遇到了一些困难 下面是一些我可以想到的大型聊天应用程序的设计: 1-服务器有状态,它们保持连接打开,客户端可以向它们推送新消息。在这种情况下,我们受到一台服务器的物理内存的限制,因此如果每个房间有太多用户,我们就无法线性扩展 2-服务器没有状态,它们请求一个分布式数据库来响应客户端的请求。在此场景中,客户端轮

我正在考虑编写一些web应用程序,它们的需求几乎与聊天室相同。我希望它们能够很容易地扩展

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

下面是一些我可以想到的大型聊天应用程序的设计:

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

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

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

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

那么,为什么第四种解决方案今天没有被广泛使用呢


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

因为您想要一个推送应用程序,您可能会使用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,提出一个开箱即用的解决方案:)