Mongo tailable cursors vs Redis pub/sub

sle*_*ica 12 publish-subscribe mongodb redis

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

客户群不断增长,单线程性能已不再足够.我需要一个pub/sub层来跨线程分发消息.

我通常会选择Redis,但由于应用程序已经使用了MongoDB,我可以使用tailable游标来避免依赖.但是,我担心性能.

对于pub/sub架构,MongoDB的游标性能与Redis相比如何?

Did*_*zia 24

实际上,他们是非常不同的野兽.

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

仍然可以预期每秒数万件物品没有重大问题,这对于一系列应用来说已经足够了.

另一方面,Redis通常可以同时处理更多连接,因为每个连接都不会创建一个线程(Redis是一个单线程事件循环).它还具有极高的CPU效率,因为它不会在所有项目中排队.使用Redis pub/sub,项目将在与发布相同的事件循环迭代中传播到订阅者.这些项目甚至没有存储在内存中,Redis甚至没有一个索引可以维护.它们仅从套接字缓冲区中检索,以便在另一个套接字缓冲区中推送.

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

使用Redis,您可以在单个核心上每秒获得数十万个项目,特别是如果您使用流水线操作和多个发布客户端.