【问题标题】:Maximum number of live replications in PouchDBPouchDB 中的最大实时复制数
【发布时间】:2018-06-14 10:31:16
【问题描述】:

我正在使用 PouchDB 开发一个 Ionic 应用程序,该应用程序需要与远程 CouchDB 服务器同步表。 在我的 database.ts 提供程序的构造函数中,我有 6 个方法:

this.initialiseDB_Ord();
this.initialiseDB_IngProd();
this.initialiseDB_Ing();
this.initialiseDB_Prod();
this.initialiseDB_OrdProd();
this.initialiseDB_Ut();

这些方法中的每一个都执行以下操作(我选择第一个作为示例):

this._DB_Ord = new PouchDB('orders');
this._remoteDB_Ord = this.addressIP + '/orders';
this._syncOpts_Ord = {  live : true,
                        retry : true,
                        continuous : true};
this._DB_Ord.sync(this._remoteDB_Ord, this._syncOpts_Ord)
.on('change',(info) => {
     console.log('Handling syncing change');
     console.dir(info);
}).on('paused',(info)=> {
     console.log('Handling syncing pause');
     console.dir(info);
}).on('active', (info) => {
     console.log('Handling syncing resumption');
     console.dir(info);
}).on('denied', (err) =>{
     console.log('Handling syncing denied');
     console.dir(err);
}).on('complete', (info) =>{
     console.log('Handling syncing complete');
     console.dir(info);
}).on('error', (err)=>{
     console.log('Handling syncing error');
     console.dir(err);
});

然后我有一个handleSyncing方法如下:

handleSyncingUt() {
  this._DB_Ut.changes({
       since             : 'now',
       live              : true,
       include_docs      : true,
       attachments   : true
  })
  .on('change', (change) =>
  {
     console.log('Handling change');
     console.dir(change);
  })
  .on('complete', (info) =>
  {
     console.log('Changes complete');
     console.dir(info);
  })
  .on('error',  (err) =>
  {
     console.log('Changes error');
     console.log(err);
  });
}

如果我最多有 5 个数据库,它就可以正常工作。 添加第六个数据库时,它不会实时同步本地 pouchDB 和远程 couchDB,而是仅在首次打开应用时同步。

有人可以帮我吗?

【问题讨论】:

  • 当您尝试启动第 6 次实时复制时,具体会发生什么?您看到什么错误或其他失败迹象?
  • 我没有看到任何错误。如果我在浏览器上刷新 Fauxton 页面,它不会更新为我发布的最后一项。使用 5 个 DB,它可以工作

标签: ionic-framework pouchdb


【解决方案1】:

@lossleader 在浏览器/WebView 中的最大连接数方面是正确的。在Quizster,我们遇到了同样的问题,因为 Quizster 必须同时同步多达 10 个 PouchDB 实例。这是使用Howler 订阅一组数据库的更改来完成的。在更改其中一个数据库后,Quizster 会在 PouchDB 实例和 CouchDB 集群之间发出一次性(非实时)同步。

了解更多背景知识:Quizster 必须将这么多 PouchDB 实例同步为:

  1. 这样做可以避免在数据库之间复制更多数据,从而降低共享数据的延迟
  2. Quizster 使用大量数据库视图来加速复制并保持较小的数据集大小。而且,每个视图都有效地指向自己的 PouchDB 实例。

我计划尽快开源更多 Quizster 堆栈,并希望也发布一些教程。

【讨论】:

  • 我几天前就知道了,但我正在同步,需要时,不是实时的。
【解决方案2】:

浏览器的最大数量为sockets per domain 和每页,而您的live:true 连接数超过了它。 Chrome 跨标签共享第一个限制,因此您可以验证连接较少的多个标签会导致 chrome 出现问题,或者通过提高 firefox 的 about:config 中的限制。

对于普通用户,您无法真正解决此限制,并且需要调整管理连接的方式(例如,worker 可以管理 chrome 中许多选项卡的一个 db 同步)并且数据设计可能会更改为观察只有一个“更改”数据库不断知道何时运行live:false 传递给其他数据库。

【讨论】:

  • 这是浏览器的问题吗?我以为即使关闭了Fauxton的浏览器,couchDB服务器也存在,还是我错了?
  • 我还是不明白你为什么说“浏览器”。我在智能手机中有我的移动应用程序,在 VPS 中有一个沙发数据库。没有 Chrome 或 Mozilla 浏览器
【解决方案3】:

由于您使用的是 Ionic(它使用浏览器/WebView 来运行您的应用程序),因此预计会有 5 个连接限制,这是一个非常疯狂的限制,对吧?不过不用担心,无需更改当前代码即可绕过此限制。

让我先解释一下为什么会存在这个限制,然后是如何解决它。

您针对 CouchDB 服务器打开的每个 PouchDB 连续同步都算作一个单独的 HTTP 连接。由于 CouchDB 的集成 Web 服务器使用 HTTP 1.1 协议(有点旧),你奇怪地受到 2 connections by the RFC 26166 connections (or more, depending on the browser/WebView version) 的限制。

查看此表以了解针对同一域的 HTTP 1.1 并发连接限制:

IE 6 and 7:      2
IE 8:            6
IE 9:            6
IE 10:           8
IE 11:           8
Firefox 2:       2
Firefox 3:       6
Firefox 4 to 46: 6
Opera 9.63:      4
Opera 10:        8
Opera 11 and 12: 6
Chrome 1 and 2:  6
Chrome 3:        4
Chrome 4 to 23:  6
Safari 3 and 4:  4

如果您想深入了解 HTTP 1.1 的限制原因,请check this article

此问题的解决方案在于 HTTP/2,这是 HTTP 系列协议的较新版本。 HTTP/2 通过在单个 TCP 连接上多路复用来解决并发 HTTP 事务限制。

由于你不能让 CouchDB 服务器自己说 HTTP/2,你可以在它前面放置一个反向代理(HAProxy 或 NGINX)或 API 网关(OpenResty、Kong、Spring Cloud Gateway、Netflix Zuul)并配置代理为 HTTP/2 端点提供服务。简而言之,我们有:

IonicApp + PouchDB <--HTTP/2--> Reverse Proxy <--HTTP 1.1--> CouchDB

HAProxy [1]的配置示例

NGINX [1]的配置示例

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多