RethinkDB changefeeds 性能:架构建议?

RethinkDB changefeeds performance: architectural advice?

我正在使用 RethinkDB 构建一个应用程序,我即将切换到使用 changefeeds。但我面临架构选择,我想得到一些建议。

我的应用程序目前在用户登录时从多个 table 加载所有用户数据(将所有数据发送到前端),然后处理来自前端的请求、更改数据库、准备和发送更改项目给用户。我想将其切换到 changefeeds。在我看来,我有两个选择:

  1. 为每个 table 设置一个更改源。按登录到特定服务器的用户过滤,并手动将更改分发给用户。这些更改源永远不会关闭,例如他们拥有我服务器的生命周期。
  2. 当用户登录时,为该用户设置一个单独的 changefeed,仅针对该用户的数据(使用带有二级索引的 getAll)。维护与当前登录用户一样多的变更源。当用户注销时关闭它们。

解决方案 #1 有一个很大的缺点:RethinkDB 变更源没有时间(或版本号)的概念,例如 Kafka 有。这意味着无法 a) 加载初始数据,以及 b) 获取自初始加载以来发生的更改。有一段时间 window 更改可能会丢失:在初始数据加载 (a) 和更改提要设置 (b) 之间。我觉得这很令人担忧。

解决方案 #2 似乎更好,因为 includeInitial 可用于获取初始数据,然后不间断地获取后续更改。我不得不处理初始加载性能(加载所有数据的单个转储比处理数千个更新更快),但它似乎更多 "correct"。但是缩放呢?我计划在每台服务器上处理多达 1000 个用户——RethinkDB 是否准备好处理数千个变更源,每个变更源本质上都是一个 getAll 查询?这些更改源中的实际 activity 会非常低,这正是我担心的数字。

RethinkDB 手册对 changefeed 缩放有点简洁,说:

Changefeeds perform well as they scale, although they create extra intracluster messages in proportion to the number of servers with open feed connections on each write.

解决方案 #2 创建了更多的提要,但对于这两种解决方案,打开提要连接的服务器数量实际上是相同的。 "changefeeds perform well as they scale" 还不够继续:-)

我也有兴趣了解处理服务器 restarts/upgrades 和断开连接的推荐做法。在我看来,如果 RethinkDB 出现任何问题,客户端必须在重新连接后执行完整的数据加载(使用 includeInitial),因为无法知道在停机期间丢失了哪些更改。这是人们所做的吗?

RethinkDB 如果在合理的硬件上,应该能够很好地处理数千个变更源。在这种情况下,一些人要做的降低网络负载的一件事是他们将代理节点放在与他们的应用程序服务器相同的机器上,并连接到该机器,因为代理节点知道足以删除通过网络传入的 changefeed 消息的重复数据,并且因为它需要从他们的主集群中卸下很多 CPU/memory 负载。

目前从崩溃中恢复的唯一方法是使用 includeInitial 重新启动 changefeed。有计划在未来添加写入时间戳,但在这种情况下处理删除很复杂。