【发布时间】:2017-07-07 06:42:29
【问题描述】:
我们确实读取了一个包含大约 500k 元素的 XML 文件(使用 xml-stream),并将它们插入到 MongoDB 中,如下所示:
xml.on(`endElement: product`, writeDataToDb.bind(this, "product"));
插入writeDataToDb(type, obj) 看起来像这样:
collection.insertOne(obj, {w: 1, wtimeout: 15000}).catch((e) => { });
现在,当 Mongo 连接断开时,xml 流仍会读取,并且控制台会充斥着错误消息(无法插入、断开连接、EPIPE 损坏……)。
在docs 中写道:
当您关闭 mongod 进程时,驱动程序会停止处理操作并继续缓冲它们,因为 bufferMaxEntries 默认为 -1,这意味着缓冲所有操作。
这个缓冲区的实际作用是什么?
我们注意到,当我们插入数据并关闭 mongo 服务器时,这些东西被缓冲了,然后我们恢复了 mongo 服务器,本机驱动程序成功重新连接并且节点继续插入数据,但是缓冲的文档(在 mongo beeing 离线期间)做不再插入。
所以我质疑这个缓冲区及其用途。
目标:
我们正在寻找将插入保持在缓冲区中直到 mongo 返回(根据wtimeout 在 15000 毫秒内)的最佳方法,然后让插入缓冲的文档或使用我们尝试过的 xml.pause(); 和 xml.resume()成功。
基本上,我们需要一些帮助来处理断开连接而不会丢失数据或中断。
【问题讨论】:
-
无法复制这一点,文档中的示例和使用
xml-stream的测试在 mongo 服务器备份后插入缓冲对象。也许您可以发布更多代码/提供更多信息关于你的设置? -
@cviejo 我无法分享我的脚本,因为它们与公司相关,但您介意将您尝试复制的脚本发送给我吗? Gist/pastebin 没问题。
标签: node.js mongodb node-mongodb-native reconnect