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