Mongo 可尾游标与 Redis 发布/订阅

Posted

技术标签:

【中文标题】Mongo 可尾游标与 Redis 发布/订阅【英文标题】:Mongo tailable cursors vs Redis pub/sub 【发布时间】:2014-09-05 20:23:49 【问题描述】:

我正在使用 MongoDB 支持实时 websocket 服务器应用程序。

客户群不断增长,单线程性能已经不够用了。我需要一个发布/订阅层来跨线程分发消息。

我通常会选择 Redis,但由于该应用程序已经使用 MongoDB,因此我可以使用可尾游标来避免依赖关系。但是,我担心性能。

对于发布/订阅架构,MongoDB 的可尾游标性能与 Redis 相比如何?

【问题讨论】:

【参考方案1】:

实际上,它们是非常不同的野兽。

MongoDB 可尾游标的工作方式有点像队列。它可以与有上限的集合一起使用,因此您不必显式删除集合中的项目。它非常有效,但请记住,MongoDB 将在每次写入操作时锁定整个集合(实际上是数据库),因此它限制了可伸缩性。另一个可伸缩性限制是连接数。每个客户端连接都会在 mongod 服务器(或 mongos)中添加一个连接线程。

您仍然可以期望每秒处理数万个项目而不会出现重大问题,这对于一系列应用程序来说可能已经足够了。

另一方面,Redis 通常可以同时处理更多的连接,因为每个连接都不会创建一个线程(Redis 是一个单头事件循环)。它的 CPU 效率也非常高,因为它不会对所有项目进行排队。使用 Redis 发布/订阅,项目在与发布相同的事件循环迭代中传播给订阅者。这些项目甚至没有存储在内存中,Redis 甚至没有要维护的单个索引。它们只从一个套接字缓冲区中检索出来,然后推送到另一个套接字缓冲区中。

但是,由于没有排队,因此根本无法保证 Redis 发布/订阅消息的传递。如果在发布消息时订阅者关闭,则该订阅者的消息将丢失。

使用 Redis,您可以预期在单个内核上每秒处理数十万个项目,尤其是在您使用流水线和多个发布客户端的情况下。

【讨论】:

以上是关于Mongo 可尾游标与 Redis 发布/订阅的主要内容,如果未能解决你的问题,请参考以下文章

当 mongodb 集合为空时,响应式可尾游标关闭

Mongo 聚合游标和计数

mongo数据删除和游标

如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?

通过 Grails 域标准在活动游标中发现 Mongo CursorNotFound 异常

mongo游标