我使用MongoDB支持实时websocket服务器应用程序。
客户群不断增长,单线程性能已不再足够。我需要一个pub / sub层来跨线程分发消息。
我通常会选择Redis,但由于应用程序已经使用了MongoDB,我可以使用tailable游标来避免依赖。但是,我担心性能。
对于pub / sub架构,MongoDB的游标性能与Redis相比如何?
答案 0 :(得分:22)
实际上,他们是非常不同的野兽。
MongoDB tailable游标有点像队列。它可以使用上限集合,因此您不必显式删除集合中的项目。它非常有效,但请记住,MongoDB将在每次写入操作时锁定整个集合(实际上是数据库),因此它限制了可伸缩性。另一个可扩展性限制是连接数。每个客户端连接都将在mongod服务器(或mongos)中添加连接线程。
在没有重大问题的情况下,每秒仍然可以预期数万件物品,这对于一系列应用来说已经足够了。
另一方面,Redis通常可以同时处理更多连接,因为每个连接都不会创建一个线程(Redis是一个单线程事件循环)。它还具有极高的CPU效率,因为它不会在所有项目中排队。使用Redis pub / sub,项目将在与发布相同的事件循环迭代中传播到订阅者。这些项目甚至没有存储在内存中,Redis甚至没有一个索引可以维护。它们仅从套接字缓冲区中检索,以便在另一个套接字缓冲区中推送。
但是,由于没有排队,因此根本无法保证发送Redis发布/订阅消息。如果订阅者在发布消息时关闭,则该订阅者将丢失该消息。
使用Redis,您可以在单个核心上每秒获得数十万个项目,特别是如果您使用流水线技术和多个发布客户端。