Rethinkdb 2.2使用include_initial进行更改

时间:2015-11-23 01:09:53

标签: rethinkdb

对于最简单的例子,假设我正在向所有订阅者推送我最喜欢的食物清单。

r.table('food').changes().run(conn, (err, cursor) => {
  cursor.each((err, change) => {
    io.emit('NEW_FAVORITE', change);
  })
})

现在让我们说我有500人积极地看着我添加我最喜欢的食物。什么会更高性能,500人订阅了500个更改进程,每个有include_initial,或500个初始查询推送到这些个人&然后500人看1改变?奖励点解释原因!

1 个答案:

答案 0 :(得分:4)

您不能让多个客户从一个更改源中读取,因此让500个人观看一个更改源的唯一方法是让一个客户从该更改源读取,然后推送到500人。

如果多个客户端订阅同一个表,则RethinkDB会对群集内的更改源消息进行重复数据删除,因此这与在网络流量方面拥有500个打开的更改源并没有任何不同。服务器将使用更多的内存,因为它跟踪哪些更改源有哪些消息,但如果您有一个客户端从更改源读取并推送到500人,则必须跟踪它。

使用include_initial的真正原因是它可以阻止比赛。如果您执行读取然后打开更改源,则可以在读取结束和更改源开始之间进行更改。 include_initial通过原子方式从阅读切换到传递更改来阻止这种情况。

(一个复杂的情况是机器A上有500个进程需要从机器B上的RethinkDB服务器读取。在这种情况下,两个解决方案之间的网络流量存在差异,因为如果您将一个客户端放在机器上从更改源读取并推送到进程,每个更改从B发送到A一次,然后在本地传输到进程,而在另一种情况下,每个更改通过网络发送500次。如果A和A之间的网络连接与在机器A上的进程之间传输的时间相比,B很慢,然后这很重要。解决这个问题的最佳方法是在机器A上添加代理节点并在该节点上打开500个更改源,因为RethinkDB将对消息进行重复数据删除到代理节点。)