mongodb - Mongo tailable cursors vs Redis pub / sub

我正在用MongoDB支持一个实时的WebSocket服务器应用程序。
客户机基础正在增长,单线程性能不再足够。我需要一个发布/子层来跨线程分发消息。
我通常会选择Redis,但是由于应用程序已经使用了MongoDB,所以我可以使用可裁剪的光标来避免依赖性。但是,我担心性能。
MongoDB的可定制光标性能与Redis的pub/sub架构相比如何?


最佳答案:

实际上,它们是非常不同的动物。
MongoDB可跟踪光标的工作方式有点像队列。它可以与带上限的集合一起使用,因此您不必显式删除集合中的项。它非常有效,但请记住,MongoDB在每次写操作时都会锁定整个集合(实际上是数据库),因此它限制了可伸缩性。另一个可伸缩性限制是连接的数量。每个客户机连接将在Mongod服务器(或Mongos)中添加一个连接线程。
尽管如此,您仍然可以期望每秒数万个项目没有重大问题,这可能足以满足一系列应用程序的需要。
另一方面,redis通常可以同时处理更多的连接,因为每个连接都不会创建线程(redis是一个单一的theaded事件循环)。它还具有极高的CPU效率,因为它不会对所有项目进行排队。使用redis pub/sub,这些项将在与发布相同的事件循环迭代中传播到订阅服务器。这些项目甚至没有存储在内存中,redis甚至没有一个索引来维护。它们只能从一个套接字缓冲区中检索,并被推入另一个套接字缓冲区。
但是,由于没有排队,因此无法保证redis pub/sub消息的传递。如果发布消息时订阅服务器关闭,则此订阅服务器的消息将丢失。
使用Redis,您可以期望在一个核心上每秒有数十万个项目,特别是如果您使用流水线和多个发布客户机。