使用 Couchbase SDK 与同步网关 API

Using Couchbase SDK vs Sync Gateway API

我完全部署了 Couchbase(服务器、同步网关和精简版),并且有一个 API、移动应用程序和 Web 应用程序都在使用它。

它工作得很好,但我想知道使用同步网关 API 是否比 Couchbase SDK 有任何优势?具体来说,我想知道 Sync Gateway 是否会比 SDK 更好地处理更多的操作,也许是内部 queue/cache 系统,但似乎无法找到这方面的权威文档。

目前 API 使用 C# Couchbase SDK,我们很少使用 SyncGateway(仅真正用于同步移动应用程序)。

简短的回答是,对于后端操作,Couchbase SDK 是您的选择,而且性能会好得多。除了少数例外 (*),Sync Gateway 旨在供移动客户端使用。

Bulk/Batch 操作

在我使用 Java Couchbase SDK 和 AsyncBucket (link), I have updated up to 8 thousand documents per second. In .Net there you can do Batch operations too (link) 的批量操作的性能测试中。

Sync Gateway 也支持批量操作,但速度要慢得多,因为它依赖于 REST API,并且它需要您提供每个要更新的文档的先前版本的 _rev。这通常会导致后端必须在执行 PUT 之前执行 GET。另外,请记住 Sync Gateway 不是存储单元。它只是作为 Couchbase 的代理,根据为每个用户注册的渠道管理移动客户端对数据段的访问,并将其所有元数据文档写入 Couchbase Server 存储桶,包括渠道索引、用户注册、文档修订和浏览量。

正在查询

视图被索引,因此对于大数据的查询它们可能会非常快速地响应。每当文档发生变化时,所有视图的映射函数都有机会映射它。但是,当通过 Sync Gateway REST API 创建视图时,一些代码会添加到您的地图函数中以处理用户 channels/permissions,这使得它比直接在 Couchbase Admin UI 中创建的纯代码慢。当你有分层数据时,使用 startKey/endKey 参数使用复合键查询视图非常强大,但移动客户端无法使用此功能和 reduce 函数的使用。

当您的 N1QL 查询利用 Couchbase 索引时,N1QL 也可以非常快。

备注

(*) 该规则的一个例外是当您想要删除文档并将其反映在手机上时。 DELETE 操作会留下一个具有 _deleted: true 属性的空文档,并且只能通过 Sync Gateway 完成。移动设备下次同步并发现此提示时,它将从本地存储中删除该文档。您还可以通过 PUT 操作设置此属性,这时您还可以添加 _exp: "2019-12-12T00:00:00.000Z" 属性以在未来某个日期执行文档的程序化清除,以便服务器也变得干净。但是,仅通过 Sync Gateway 清除文档等同于通过 Couchbase SDK 将其删除,这不会反映在移动设备上。

注意:在 Sync Gateway 1.5 和 Couchbase 5.0 之前,所有后端操作都必须直接在 Sync Gateway 中完成,以便 Sync Gateway 和移动客户端可以检测到这些更改。这在引入 shared_bucket_access 选项后发生了变化。更多信息 here.

首先,一些相关的背景信息

需要同步到 Couchbase Lite (CBL) 客户端的每个文档都需要由同步网关 (SGW) 处理。无论文档是通过 SGW API 编写还是通过服务器写入(N1QL 或 SDK),都是如此。后一种情况称为“导入处理”,其中(通过 N1QL)写入存储桶的文档由 SGW 通过 DCP 提要读取。该文档然后由 SGW 处理并使用相关的同步元数据写回存储桶.

先决条件

为了让 SGW 导入直接通过 N1QL/SDK 写入的文档,您必须启用“共享存储桶访问”和导入处理,如 here

所述

非移动文档:

如果您有永远不会同步到 CBL 客户端的文档,那么选择是显而易见的。使用服务器 SDK 或 N1QL

移动文档(同步到 CBL 客户端的文档):

假设您在 SGW 2.x 与 CBL 2.x 客户端同步

如果您有在服务器端编写的文档需要同步到 CBL 客户端,请考虑以下

  • 服务器端写入速率:

如果您正在查看服务器端以显着超过 1.5K/秒(比方说 5K/秒)的持续速率写入,那么您应该选择 SGW API 路线。虽然通过服务器 N1QL 查询进行批量更新很容易,但请记住 SGW 仍然需要跟上并进行导入处理(在后台讨论)。

这意味着,如果您通过 SDK/N1QL 进行大量更新,则必须对其进行速率限制,以便 SGW 能够跟上(通过 SDK 进行批量更新)

也就是说,重要的是要考虑这样一个事实,即如果 SGW 跟不上 DCP 馈送上的写入吞吐量,无论写入如何发生,都会导致延迟(SGW API 或 N1QL)

如果你在服务器上的持续写入率不是特别高,那么就选择 N1QL。

  • 删除处理:

无所谓。在 shared-bucket-access 下,通过 SDK 或 SGW API 进行的删除将导致逻辑​​删除。阅读更多相关信息 here

  • SGW 特定配置:

当然,如果您正在处理 SGW 特定配置,创建 SGW 用户、角色,那么您将为此使用 SGW API。

  • 冲突处理:

在2.x,无所谓。冲突在 CBL 端处理。

与 SGW 的挑战 API

  • 可能在现实场景中最大的挑战是使用 SG API 路径意味着要么在外部系统中存储关于 SG 修订 ID 的信息,要么以先读后写的方式执行每个突变(因为我们无法在不提供修订 ID 的情况下 PUT 文档)