2016-12-20 54 views
2

我正在尋找在數據流中實現流式搜索/過濾系統。系統本身非常複雜,所以我會用一個簡單的例子來描述我的問題。加入歷史和流數據

假設我想允許我的系統用戶爲新聞文章設置警報,以匹配包含指定關鍵字的任何文章。與我的問題有關的是,當系統添加警報時,需要返回並匹配全部之前包含該關鍵字的文章。當然,它也需要開始與任何新文章進行匹配。

我的想法是加入包含警報流的文章流,檢查每條警報的每篇文章。

我的問題是:什麼是一個很好的方式來存檔過去的文章,可以檢查新的警報,有沒有辦法避免太複雜和特殊的框?理想情況下,我只需將全部文章放在pcollection中,並添加一個全局窗口和一個觸發器,以發出所有新元素並加入一系列警報。這是可行的嗎?如果我的工作出現問題,我如何確保我不會丟失文章?

回答

1

基本上,每當新文章到達時,您都希望掃描所有現有警報並找到匹配的警報;每當新的警報到達時,您也想掃描所有現有文章並找到相匹配的文章。

我想你有一些有效的方式來爲一篇文章找到一篇警報的匹配文章,並且匹配一篇文章的警報,而不是掃描整個數據庫,但如果沒有(例如,如果數據庫很小),那也沒關係。

一種選擇是這樣一個系統:

  • 在添加新文章,1)將其寫入索引的存儲系統(如Bigtable的,或Elasticsearch,或數據庫,或類似的東西) 2)發佈PubSub主題的「新文章」事件
  • 當添加新警報時,做相反的事情:也寫入索引存儲系統併發出事件
  • 讓管道監聽兩個事件pubsub主題。獲取「新文章」事件時,它會掃描警報數據庫以查找匹配的警報(使用任何可用的索引)。獲取「新警報」事件時,用於匹配文章。

這是否有意義?

+0

它的確如此,但我想在Dataflow中做到這一點,包括保持狀態。另外,我需要能夠處理存檔數據。所以我正在尋找一種方法來實現這個使用數據流構造。 –

+0

另外:警報的集合很小,可能只有極少數,但是這組文章將是數以億計的巨量。我並不介意在添加新警報時出現延遲,因此,只要Dataflow可以擴展到新的段,那麼只要有新的段,就處理每個「(article,segment)」組合。 –

+0

我明白了。我仍然建議在我的回答中使用這種方法:數據流可以保持相當數量的狀態,但它不是一個存儲系統,所以我不建議嘗試將它用於數以億計的文章。 – jkff