1

目的:与Postgres数据库同步elasticsearch
为什么:有时newtwork或群集/服务器突破使将来的更新应该被记录同步elasticsearch - 的NodeJS

本文https://qafoo.com/blog/086_how_to_synchronize_a_database_with_elastic_search.html建议我应该创建一个单独的表updates,它将同步elasticsearch的id,允许从最后一条记录(在elasticsearch中)选择新数据(从数据库)。所以我想如果我可以记录elasticsearch的失败和成功的连接:如果client归属成功(返回一个承诺),我可以启动一个函数来同步记录与我的数据库。

这里是我的elasticConnect.js

import elasticsearch from 'elasticsearch' 
import syncProcess from './sync' 

const client = new elasticsearch.Client({ 
    host: 'localhost:9200', 
    log: 'trace' 
}); 


client.ping({ 
    requestTimeout: Infinity, 
    hello: "elasticsearch!" 
}) 
.then(() => syncProcess) // successful connection 
.catch(err => console.error(err)) 


export default client 

这样一来,我甚至都不需要担心运行cron作业(如果问题是正确的),因为我知道,集群正在运行。

问题

  1. 请问syncProcessexport default client前跑?我不希望任何请求,而在未来同步...

  2. syncProcess应该只运行一次(因为它的缓存/不出口),无论我importelasticConnect.js多少倍。正确?

  3. 使用updates表的方法是否有任何优势,而不是从父/源表中选择数据?

  4. 该文章的评论说“不使用时间戳来比较新数据!”.Ehhh ...为什么?它应该没问题,因为数据库被阻止,对吧?

回答

1

对于1:因为您不能保证syncProcess在客户端导出时已经运行。相反,您应该像this answer中那样做,然后输出诺言。

对于2:通过我在上述问题中链接到的解决方案,这将被照顾。

对于3:更新表也会捕获记录删除,而从数据库中选择则不会,因为您不知道哪些记录已经消失。

对于4:您链接到的文章后的第二条评论提供了答案(提示:时间戳不严格单调)。

+0

问题:在文章中他们只提到“为了同步,运行cron job”。但是这不可能是正确的,因为来自elasticsearch的last_squence_id将被改变,因此丢失了旧的更新。所以我需要确保在将数据插入到elasticsearch之前进行同步,对吗? – Antartica