更改前关闭 RethinkDB 更改提要
close RethinkDB changefeed before changed
我似乎无法在 rethinkdb 文档中找到任何关于如何在第一个更改被触发之前停止更改源的信息。这是必要的问题:
客户端通过一个套接字连接到服务器,开始一个 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 中的状态对象并在第一次更改后关闭 feed 来解决,但理论上如果没有更改并且有许多连接的客户端,我们可能会打开许多会消耗内存的游标无缘无故(一更新就关了)
有没有办法在不执行 run
回调的情况下从更改源获取光标?或者,有没有办法强制重新考虑对 run
回调执行初始状态更新?
即使服务器立即响应,您也会遇到此问题,因为用户可能会在您将查询发送到服务器之后和响应返回之前断开连接。不幸的是,我们无法在将查询发送到服务器之前创建游标,因为在一般情况下,弄清楚查询的 return 类型有点困难,因此我们不将这种逻辑放在客户端中。
我认为最好的选择是你所描述的,如果光标还没有被 returned,你设置一个标志并在回调中关闭它。您也许可以使用 promises 使逻辑更清晰。
除非您确定这是个问题,否则我不会担心内存使用;如果一秒钟的某一部分没有变化,我们 return 一个没有初始值的游标到客户端,所以在很多用户打开然后立即关闭连接的情况下你的内存使用将与如何成正比许多用户可以在那一秒内做到这一点。如果那部分秒对您来说太长,您可以将其配置为更小,并将 optargs 设置为 run
(http://rethinkdb.com/api/javascript/run/)。 (在你的情况下,我只是将 firstBatchScaledownFactor
设置得更高。)
我似乎无法在 rethinkdb 文档中找到任何关于如何在第一个更改被触发之前停止更改源的信息。这是必要的问题:
客户端通过一个套接字连接到服务器,开始一个 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 中的状态对象并在第一次更改后关闭 feed 来解决,但理论上如果没有更改并且有许多连接的客户端,我们可能会打开许多会消耗内存的游标无缘无故(一更新就关了)
有没有办法在不执行 run
回调的情况下从更改源获取光标?或者,有没有办法强制重新考虑对 run
回调执行初始状态更新?
即使服务器立即响应,您也会遇到此问题,因为用户可能会在您将查询发送到服务器之后和响应返回之前断开连接。不幸的是,我们无法在将查询发送到服务器之前创建游标,因为在一般情况下,弄清楚查询的 return 类型有点困难,因此我们不将这种逻辑放在客户端中。
我认为最好的选择是你所描述的,如果光标还没有被 returned,你设置一个标志并在回调中关闭它。您也许可以使用 promises 使逻辑更清晰。
除非您确定这是个问题,否则我不会担心内存使用;如果一秒钟的某一部分没有变化,我们 return 一个没有初始值的游标到客户端,所以在很多用户打开然后立即关闭连接的情况下你的内存使用将与如何成正比许多用户可以在那一秒内做到这一点。如果那部分秒对您来说太长,您可以将其配置为更小,并将 optargs 设置为 run
(http://rethinkdb.com/api/javascript/run/)。 (在你的情况下,我只是将 firstBatchScaledownFactor
设置得更高。)