目标:将elasticsearch与postgres数据库同步
原因:有时网络或集群/服务器会中断,因此应记录 future 的更新
本文https://qafoo.com/blog/086_how_to_synchronize_a_database_with_elastic_search.html建议我应该创建一个单独的表 updates
来同步 elasticsearch 的 id
,允许选择自上次记录(在 elasticsearch 中)以来的新数据(来自数据库)。所以我想如果我可以记录 elasticsearch 的失败和成功连接会怎么样:如果 client
ponged 成功返回(返回 promise ),我可以启动一个功能来与我的数据库同步记录.
这是我的 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 是正确的),因为我知道集群正在运行。
问题
syncProcess
会在export default client
之前运行吗?我不想在同步时收到任何请求...syncProcess
应该只运行一次(因为它被缓存/未导出),无论我import
elasticConnect.js
多少次>。正确吗?使用
updates
表的方法,而不是仅仅从父表/源表中选择数据,是否有任何优势?文章的评论说“不要使用时间戳来比较新数据!”。嗯……为什么?应该没问题,因为数据库正在阻塞,对吧?
最佳答案
对于 1:您不能保证 syncProcess
将在客户端导出时运行。相反,你应该做类似 this answer 中的事情并导出一个 promise 。
对于 2:使用我在上述问题中链接的解决方案,这将得到解决。
对于 3:更新表也会捕获记录删除,而简单地从数据库中选择不会,因为您不知道哪些记录已经消失。
对于 4:您链接到的文章后的第二条评论提供了答案(提示:时间戳不是严格单调的)。
关于node.js - 在与数据库的连接上同步 elasticsearch - nodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757377/