【问题标题】:How to persist a MongoDB cursor in between requests?如何在请求之间持久化 MongoDB 游标?
【发布时间】:2013-06-05 06:15:39
【问题描述】:

在网络服务器的较量中:

为了避免重新查询(使用find),可以尝试在请求之间保持find 返回的游标引用。 Cursor 对象是一个复杂的对象,例如存储套接字连接。如何存储这样的对象以避免对后续 Web 请求的重新查询?我正在使用 Node.js,但任何建议都是有帮助的(不管是什么语言:rails、C#、Java、PHP)。

(我正在使用持久会话)

【问题讨论】:

  • 由于游标以文档的 16meg 限制定义的小批量返回,我不确定存储对游标的引用有多有用,实际上它可能是微优化,因为您只会避免16meg 的结果,您必须再次重新查询
  • 在必须显示查询结果的网络应用程序中是否有任何帮助的光标?我正在考虑诸如 Twitter 流或 Facebook 新闻提要之类的场景,其中您有“无限”流或项目。
  • 嗯,是的,所有查询结果都作为游标返回,无论是服务器端还是客户端,客户端游标对象是服务器自己的表示。我仍然不知道它对 facebook 提要或 twitter 提要有多大用处。我认为您可能会在第一页上显示至少 16 兆的结果,当您使用 ajax 获得更多结果时,您只需允许创建一个新光标,很可能此时旧光标已经被 gced。跟踪这一点可能不仅仅是重新查询更多的工作。
  • 为什么 PHP 驱动程序已经为您存储光标了?这就是您能够“获取更多”文档的方式(即获取下一批)您能描述一下您的确切用例吗?
  • @AsyaKamsky 他的意思是在脚本之间,所以想象一下你在 filea 中有一个光标,但想在 fileb 中使用它,而不是创建一个新的光标

标签: php ruby-on-rails node.js mongodb web-applications


【解决方案1】:

Facebook 和 Twitter 的流功能比对数据库的简单查询更复杂。像这样的系统往往在其架构中有两个主要的后端组件,为您提供数据:慢速和快速。

1) 第一个后端系统是您的数据库,通过查询访问以从流中获取结果页面(作为某人的 twitter 提要或他们的 fb 提要)。当您分页到底部或单击“更多结果”时,它只会增加页面变量并针对当前流的该页面的 API 进行查询。

2) 第二个是一个完全独立的系统,它通过 websockets 向您的页面发送实时更新或针对 API 调用进行分页。这是架构中“快速”的部分。这可能不是来自数据库,而是某处的队列。从这个队列中,处理程序将您的数据发送到您的页面,这是一个订阅者。

系统是这样设计的,因为要进行大规模扩展,您不能依赖实时更新您的数据库。它是大批量完成的。因此,您通过架构的快速部分运行该数据的一个非常小的子集,了解用户从“快速”后端获取数据的方式可能与最终在“慢速”后端的外观不完全相同,但是它足够近了。

所以...故事的寓意:

您不想保留您的 db 游标。您想 1) 我是否需要实时更新 2) 如果需要,我该如何构建我的系统,以便第一次调用可以获得我的大部分数据,而第二次调用/机制可以使其保持最新状态。

【讨论】:

  • 考虑到 MongoDB 辅助服务器可以很容易地用于从数据库而不是队列扩展陈旧的读取。因此,这可以完全从数据库中完成,因此存储指向游标的指针是有效的,它只是微优化,可能不需要 tbh
  • 你确定 MongoDB 是单线程的吗?那个光标也是这样工作的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2015-08-07
  • 2011-03-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多