【问题标题】:close RethinkDB changefeed before changed在更改之前关闭 RethinkDB changefeed
【发布时间】:2015-05-25 18:39:19
【问题描述】:

我似乎在 rethinkdb 文档中找不到任何关于如何在第一次更改被触发之前停止 changefeed 的信息。这是使这变得必要的问题:

客户端通过套接字连接到服务器,该套接字开始一个 changefeed,如下所示:

var changeCursors = {};
db('app').table('things').changes().run(cursor, function(err, cursor) {
  // do something when changed
  changeCursors[user.id] = cursor
})

// later, when the user disconnects
changeCursors[user.id].close()

当第一次更改被调度时,我可以将游标分配给内存中的一个变量,如果客户端断开连接,关闭这个游标。

但是,如果用户在第一次更改之前断开连接怎么办?

据我所知,rethink 不支持向提要发送初始状态,因此光标仅在更改后可用。但是,如果用户断开连接,changeCursors[user.id] 是未定义的,并且 changefeed 将永远保持打开状态。

这可以通过检查 changefeed 中的 state 对象并在第一次更改后关闭 feed 来解决,但理论上如果没有更改且连接的客户端很多,我们可能会打开许多​​游标,这些游标会占用内存原因(它们将在更新后立即关闭)。

有没有办法在不执行run 回调的情况下从变更提要中获取光标?或者,有没有办法强制重新考虑对run 回调执行初始状态更新?

【问题讨论】:

  • 谢谢你提出这个问题——我只是在谷歌上搜索如何关闭更改光标,你的代码告诉我——我很好奇,因为我在文档中没有找到它,你在哪里找到 cursor.close() ?另外 - 维护每个用户/连接的游标数组的想法非常好,我现在也使用了它的变体。再次感谢。

标签: node.js sockets rethinkdb


【解决方案1】:

即使服务器立即响应,您也会遇到此问题,因为用户可能会在您将查询发送到服务器之后并且在响应返回之前断开连接。不幸的是,我们无法在将查询发送到服务器之前创建游标,因为在一般情况下,确定查询的返回类型有点困难,因此我们不会将该逻辑放在客户端中。

我认为最好的选择是您所描述的,如果尚未返回光标,您设置一个标志并在回调中关闭它。您也许可以使用 Promise 使逻辑更清晰。

除非您确定这是个问题,否则我不会担心内存使用情况;如果一秒钟的某些部分没有变化,我们会向客户端返回一个没有初始值的游标,因此在很多用户打开然后立即关闭连接的情况下,您的内存使用量将与用户数量成正比在那一秒的时间里。如果一秒的那一部分对您来说太长,您可以使用 optargs 将其配置为更小run (http://rethinkdb.com/api/javascript/run/)。 (在您的情况下,我会将 firstBatchScaledownFactor 设置为更高。)

【讨论】:

  • 啊,我明白了 - 我将继续使用我目前的解决方案,感谢有关内存使用情况的知情回答,我假设暂时保持这些打开是可以的,如果我运行,请重新访问到问题!
猜你喜欢
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多