CouchDB 是否有一个错误与沙发纳米变化阅读器批处理,或我错过了什么?

64jmpszr  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(252)

这与couchdb-nano库的changesReader API有关。

预期行为

我希望下面的代码等待10秒,然后从变更提要的最后一个位置返回一批消息。因此,如果我在10秒的超时时间内更新了DB 5次,我希望看到:10秒后“一批5个变更已到达”。

messages.changesReader
  .start({ timeout: 10000 })
  .on('batch', (batch) => {
    console.log('a batch of', batch.length, 'changes has arrived');
  }).on('error', (e) => {
    console.error('error', e);
  });
当前行为

现在的情况是没有批处理发生。每次我在超时内更新数据库时,我 * 立即 * 得到日志“一批1个更改已经到达”。
我是否错过了一些明显的东西,或者误解了nano的批处理工作原理?

pbpqsu0x

pbpqsu0x1#

nano没有问题。超简短的答案是使用get,但即使这样,你对timeout的解释(看起来更像是暂停或积累)也是有缺陷的。
考虑start的文档
(start)通过重复的“长轮询”请求无限期地监听更改。此模式将无限期地轮询更改。
好的,这很清楚,start“无限期地”轮询。
更改馈送请求等待数据的毫秒数
因此,当使用start时,timeout * 不适用 *。是的,文档可能不那么令人费解。
timeout何时适用?
(get)通过重复的“long poll”请求,监听更改,直到到达更改馈送的结尾。一旦接收到零更改的响应,“end”事件将指示更改的结尾,并且轮询将停止。
换句话说,如果X毫秒过去了,没有变化事件,get轮询以end事件结束(也可能是spool-我没有测试)。
请考虑下面的节点脚本,它演示了get的行为。end事件将在最后一个批处理事件激发10秒后发生。
下面是一个输出示例

$ node nano.js
Processing start 3:38:00 PM
a batch of 1 changes has arrived at 3:38:01 PM
a batch of 2 changes has arrived at 3:38:01 PM
a batch of 4 changes has arrived at 3:38:05 PM
a batch of 1 changes has arrived at 3:38:05 PM
a batch of 1 changes has arrived at 3:38:08 PM
Processing ended at 3:38:18 PM

请注意,脚本在last事件后10秒(超时)结束。
如果将get替换为start,则永远不会触发end事件。

const nano = require("nano")("http://uid:pwd@127.0.0.1:5984");
const db = nano.db.use("my_scratch_db");
const nowstr = () => new Date().toLocaleTimeString();

console.log(`Processing start ${nowstr()}`);

(async () => {
    db.changesReader
        .get({ timeout: 10000 })
        .on("batch", (b) => {
            console.log("a batch of", b.length, `changes has arrived at ${nowstr()}`);
        })
        .on("end", (e) => {
            console.log(`Processing ${nowstr()}`);
        })
        .on("error", (e) => {
            console.error("error", (e || "no reason given").toString());
        });
})();

setTimeout(() => {
    // insert some docs, one at a time
    const docs = [{ a: 1 }];
    db.bulk({ docs });
    db.bulk({ docs });
    db.bulk({ docs });
}, 1000);

setTimeout(() => {
    // insert a batch of docs
    const docs = [{ a: 3 }, { a: 4 }, { a: 5 }, { a: 6 }, { a: 7 }];
    db.bulk({ docs });
}, 5000);

setTimeout(() => {
    // insert one last doc
    const docs = [{ a: 1 }];
    db.bulk({ docs });
}, 8000);

更新

我认为有必要补充一点,即提要响应可能会因服务器和客户机的配置而异。例如,随后运行上面的脚本会产生紧凑的批处理响应:

Processing start 4:54:34 PM
a batch of 3 changes has arrived at 4:54:35 PM
a batch of 5 changes has arrived at 4:54:39 PM
a batch of 1 changes has arrived at 4:54:42 PM
Processing ended at 4:54:52 PM

相关问题