【问题标题】:Pouchdb sync doesn't save data to remote immediatelyPouchdb 同步不会立即将数据保存到远程
【发布时间】:2019-06-26 15:23:58
【问题描述】:

我用远程数据库编写了 pouchdb 同步(在 Angular 应用程序中),远程数据库将远程更改发送到应用程序。

我根据 PouchDb 文档了解到,本地 IndexedDb 和远程服务器之间的数据应该通过 PouchDb.sync 同步。之后,它将由第二个客户获得。

这是我用于同步的代码:

export const appDataDbSyncArgs: IDbSyncArguments = {
    localDbName: "app_data",
    remoteDbUrl: "http://localhost:4984/app_data",    
    syncOptions: {
        live: true,
        retry: true,
        since: 0,
        batch_size: 1,
        batches_limit: 1
    }
};


PouchDB.replicate(remoteDbUrl, localDbName)
        .on("active", () => {
            console.log("replication is active");
            const replicationStartedMessage = applyMessageType({}, replicationStarted);
            messenger.postMessage(replicationStartedMessage);
        })
        .on("complete", info => {
            console.log("%cReplication has been completed.", "color: lightgreen; font-size: 20px;");
            const replicationCompleteMessage = applyMessageType(info, replicationComplete);
            messenger.postMessage(replicationCompleteMessage);

            PouchDB.sync(localDbName, remoteDbUrl, syncOptions)
                .on("change", changeInfo => {
                    console.log("%cSync changes", "color: green; font-size: 20px;");
                    const changesInfoMessage = applyMessageType(changeInfo, syncChanges);
                    messenger.postMessage(changesInfoMessage);
                })
                .on("error", err => {
                    console.log("sync error", err);
                    const errorMessage = applyMessageType(err, syncError);
                    messenger.postMessage(errorMessage);

                })
                .on("paused", err => {
                    console.log("sync error (paused)", err);                

                })
                .on("active", () => {
                    console.log("sync active");

                })
                .on("denied", err => {
                    console.log("sync error (denied)", err);        

                })
                .on("complete", info => {
                    console.log("sync complete", info);                   

                });
        })
        .on("error", err => {
            console.log("replication error", err);
            const replicationErrorMessage = applyMessageType(err, replicationError);
            messenger.postMessage(replicationErrorMessage);
        });

这是我用来保存数据的代码:

protected _addDocument<T> (id: string, document: PutDocument<{} & T>): Observable<Response> {
        document['_id'] = id;
        //document._rev = null;
        return fromPromise(this._db.put<T>(document))
            .pipe(
                take(1) 
            );
    }

// Where this._db = new PouchDB(localDbName);

它会立即将数据保存到 IndexedDb,但不会将其保存在远程数据库中。有时数据会在 5-10 分钟或更长时间后到达远程数据库。有时立即。但是,如果数据来自远程数据库,或者我更改远程服务器中的数据,pouchDb 会触发“onChange”事件,第二个客户端会在应用程序中获取它。

但我需要将保存在 IndexedDb 中的数据立即保存在远程数据库中。

【问题讨论】:

    标签: pouchdb


    【解决方案1】:

    这是预期的行为。 CouchDB 以及 PouchDB 的扩展是“最终一致的”。这意味着跨节点的数据可以保证最终变得一致,但不能保证多快。您应该牢记这一点来设计您的应用程序。

    话虽如此,您可以采取一些措施来提高数据复制速度的机会。特别是看options for replication in PouchDB

    根据您的描述,特别感兴趣的是retryback_off_function 选项。如果 PouchDB 检测到您离线,它将开始在复制之间引入延迟,最多 10 分钟。这可能是你正在经历的。

    您可以考虑禁用重试选项(并在检测到客户端重新联机时手动或以编程方式重新启动复制),或编写自定义回退函数,以将最长时间限制在您认为合适的范围内.

    【讨论】:

    • 其实我想创建一个可以实时同步数据的应用。此功能具有高优先级。可能使用 pouchdb 不是实时交换数据的正确方法。你怎么看?
    • 你认为 _ 如果 PouchDB 检测到你离线 _ 。但是我的一个大问题是,当应用程序通过本地网络连接在线时会发生这种延迟。 (而且我需要它在 3G 移动网络上也能正常工作)
    • 如果您需要实时数据同步,我会说最终一致性不适合您。你熟悉CAP theorem吗? Couch/Pouch 保证 C 和 P,但你说 A 对你的应用程序来说是最重要的,所以你可能需要一个不同的工具,牺牲 C 或 P,但保证 A。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2017-02-06
    • 2017-05-10
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多