【问题标题】:Sync elasticsearch on connection with database - nodeJS在与数据库的连接上同步elasticsearch - nodeJS
【发布时间】:2017-02-07 00:23:51
【问题描述】:

目标:将 elasticsearch 与 postgres 数据库同步
原因:有时新网络或集群/服务器会中断,因此应记录未来的更新

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

这是我的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 是正确的),因为我知道集群正在运行。

问题

  1. syncProcess 会在export default client 之前运行吗?我不希望在同步时收到任何请求...

  2. syncProcess 应该只运行一次(因为它被缓存/未导出),不管我importelasticConnect.js 多少次。对吗?

  3. 使用updates表的方法,而不是只从父/源表中选择数据有什么好处吗?

  4. 文章的 cmets 说“不要使用时间戳来比较新数据!”。呃……为什么?应该没问题,因为数据库被阻塞了,对吧?

【问题讨论】:

    标签: node.js postgresql elasticsearch synchronization elasticsearch.js


    【解决方案1】:

    对于 1:因为您不能保证 syncProcess 将在客户端导出时运行。相反,您应该在 this answer 中执行类似操作并导出一个承诺。

    对于 2:使用我在上述问题中链接的解决方案,这将得到解决。

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

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

    【讨论】:

    • 问题:在文章中他们只提到“为了同步,运行 cron 作业”。但这不可能是正确的,因为来自 elasticsearch 的 last_squence_id 将被更改,因此会丢失旧的更新。所以我需要确保在将数据插入弹性搜索之前进行同步,对吗?
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2012-08-10
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多