当前我们正在使用nodejs&Lokijs。由于我们的应用程序正在处理实时数据;要与外部NOSQL/关系数据库进行通信会导致延迟问题。
所以我们决定使用内存数据库,即lokijs。
lokijs擅长于我们使用其中包含500-100个文档的收藏品时。但是,当涉及到更新时&并行读取;情况更糟。
这意味着我们的供应商之一已发布Kafka端点以消耗供稿,并再次将其提供给一些外部服务;从Kafka主题中,我们每秒获得100-200个活动。因此,每当我们收到Kafka活动时,我们都会更新现有的集合。由于Delta更新过于频繁,因此Lokijs Collection更新无法通过该阅读给出不一致的结果来正确完成。
这是我的收藏创建片段。
let db= new loki('c:products.json', {
autoload: true,
autosave: true,
autosaveInterval: 4000
});
this.collection= db.addCollection('REALTIMEFEED', {
indices: ["id", "type"],
adaptiveBinaryIndices: true,
autoupdate: true,
clone: true
});
function update(db, collection, element, id) {
try {
var data = collection.findOne(id);
data.snapshot = Date.now();
data.delta = element;
collection.update(data);
db.saveDatabase();
} catch (error) {
console.error('dbOperations:update:failed,', error)
}
}
你能建议我,我在这里错过了什么。
我认为您的问题在于您在每个更新中保存数据库。您已经指定了autoSave
和autoSaveInterval
,因此Lokijs将定期保存您的数据。如果您还强制从每次更新中保存该过程,则由于JS是单线读取的,因此必须处理大部分操作(当保存操作传递到OS以获取文件保存位时,它可以继续运行(。