2016-02-14 16 views
4

我很好奇使用Cloud DataFlow和PubSub時確保冪等的最佳方法嗎?如何確保DataFlow和Cloud Pub Sub的媲美?

我們目前有一個處理和存儲MySQL數據庫中的記錄的系統。我對使用DataFlow進行某些報告很感興趣,但想了解我需要做些什麼來確保我沒有意外地重複計數(或超過兩次計數)相同的消息。

我的困惑有兩個部分,首先確保我只發送一次消息,其次確保我只處理一次消息。

我的直覺是如下:

每當我感興趣的是記錄在我們的MySQL數據庫的事件,它改造成一個PubSub的消息,並將其發佈到PubSub的。 假設成功,請記錄與MySQL記錄一起返回的PubSub ID。這樣,如果它有一個PubSub ID,我知道我已經發送了它,我不需要再發送它。如果發佈到PubSub失敗,那麼我知道我需要再次發送它。都好。

但是,如果在PubSub寫入成功後寫入MySQL失敗,我可能會再次向pub sub發佈相同的消息,所以我需要DataFlow端的某些內容來處理這種情況以及PubSub發送消息兩次(按照https://cloud.google.com/pubsub/subscriber#guarantees)。

處理這個問題的最佳方法是什麼?在AppEngine或其他系統中,我會對數據存儲進行檢查,看看我正在創建的新記錄是否存在,但我不確定如何使用DataFlow執行此操作。有沒有一種方法可以輕鬆實現過濾器來停止正在處理兩次的消息?或者DataFlow已經處理過了嗎?

回答

6

數據流可以在接收端根據任意消息attribute(由idLabel選擇)去重複消息,如Using Record IDs中所述。從生產者角度來看,您需要確保您是基於MySQL記錄的確定性和唯一性填充屬性。如果這樣做正確,Dataflow將會精確地處理每個邏輯記錄一次。