Dataflow 支援串流工作的兩種模式:
- 僅處理一次模式。所有 Dataflow 串流工作都預設採用這個模式。在此模式下,Dataflow 會確保資料在管道中移動時,記錄不會遭到捨棄或重複。
- 至少傳送一次模式。這個模式可確保記錄至少會處理一次 (也就是不會遺失任何輸入記錄)。不過,這個模式可能會產生重複記錄。對於可容許重複項目的用途,至少一次模式可大幅降低作業的成本和延遲時間。
選擇要使用的串流模式
如要確保管道提供準確的結果和可預測的語意,請選擇「僅限一次」模式。例如:
- 具有匯總的管道,例如計數、總和或平均值。
- 業務關鍵用途,需要記錄處理一次且僅處理一次。例如詐欺偵測、網路威脅偵測和電子商務庫存資訊主頁。
如果工作負載可接受重複記錄,且可能因降低成本或延遲時間而受益,請選擇「至少一次」串流模式。例如:
- 工作負載:重複資料刪除作業是在 Dataflow 的下游執行。例如,寫入 BigQuery 或 SQL 資料儲存區的管道。
- 只有對應的管道,沒有匯總。例如記錄處理、變更資料擷取,或擷取、轉換及載入 (ETL) 工作,管道只會執行每個元素的轉換,例如結構定義轉換。
- 輸出接收器無法保證僅傳送一次的管道,例如 Pub/Sub。在這種情況下,管道內的重複資料刪除作業可能是不必要的,而且您可享有「至少一次」串流模式的成本和延遲時間優勢。
- 從 Pub/Sub 讀取的管道。使用「至少一次」模式時,從 Pub/Sub 讀取資料的作業會大幅最佳化。
其他事項
至少一次模式可大幅降低管道的成本和延遲時間。實際影響取決於管道的具體情況。在實際負載下測試「至少一次」串流,評估影響。
使用「至少一次」模式時,重複記錄的比例取決於重試次數。基準率通常很低 (低於 1%)。不過,如果工作站節點發生故障,或因其他情況導致重複的 RPC 呼叫,就可能會出現尖峰。
串流模式會影響 Streaming Engine 處理記錄的方式,但不會變更 I/O 連接器的語意。建議您讓 I/O 語意與串流模式保持一致。舉例來說,如果您搭配使用BigQuery I/O 連接器和至少一次串流模式,請將寫入模式設為
STORAGE_API_AT_LEAST_ONCE。Google 提供的 Dataflow 範本:使用「至少一次」串流時,系統會自動啟用這個選項。元素轉換 (例如
Map) 不一定會是等冪。舉例來說,假設有個函式會接收訊息,並在訊息中附加目前的時間戳記。在這種情況下,重複的記錄可能會產生多個不同的輸出內容。至少一次模式可能不適合該管道。
設定串流模式
所有 Dataflow 工作都預設採用「只處理一次」機制。如要啟用「至少一次」串流模式,請設定 streaming_mode_at_least_once
服務選項。
Java
--dataflowServiceOptions=streaming_mode_at_least_once
Python
--dataflow_service_options=streaming_mode_at_least_once
Go
--dataflow_service_options=streaming_mode_at_least_once
如未指定 streaming_mode_at_least_once 選項,Dataflow 會使用恰好一次串流模式。
如果您設定 streaming_mode_at_least_once 選項,Dataflow 會自動啟用 Streaming Engine 和以資源為基礎的計費。
如要更新執行中工作的串流模式,請啟動替代工作。
選取範本的串流模式
如要在執行 Dataflow 串流範本時選取串流模式,請按照下列步驟操作:
控制台
前往 Google Cloud 控制台的 Dataflow「Jobs」(工作) 頁面。
按一下「Create job from template」(依據範本建立工作)。
從「Dataflow template」(Dataflow 範本) 下拉式選單中選取要執行的範本。
在「串流模式」,選取串流模式。如果範本僅支援一種模式,這個選項就會停用。
gcloud
如要啟用「至少一次」模式,請在 additional-experiments 旗標中設定 streaming_mode_at_least_once 選項:
--additional-experiments=streaming_mode_at_least_once
如要啟用「僅需處理一次」模式,請在 additional-experiments 旗標中設定 streaming_mode_exactly_once 選項:
--additional-experiments=streaming_mode_exactly_once
這兩個選項互斥。如未設定其中一個選項,範本會預設為由範本中繼資料決定的串流模式。詳情請參閱「自訂範本」。
REST
在 FlexTemplateRuntimeEnvironment (Flex 範本) 或 RuntimeEnvironment (傳統範本) 物件中使用 additionalExperiments 欄位。
{
additionalExperiments : ["streaming_mode_at_least_once"]
...
}
自訂範本
如果您建立的自訂範本支援「至少一次」處理,請在範本中繼資料檔案中新增下列頂層欄位:
{
"streaming": true,
"supportsAtLeastOnce": true,
"supportsExactlyOnce": true,
"defaultStreamingMode": "AT_LEAST_ONCE"
}
使用者在 Google Cloud 控制台中部署範本時,可以透過這些中繼資料欄位選取串流模式。defaultStreamingMode 欄位為選用欄位,可指定範本的預設串流模式。如未指定 defaultStreamingMode,且範本同時支援這兩種模式,則預設為「僅一次」模式。
詳情請參閱 Dataflow 範本說明文件中的下列章節:
- Flex 範本:中繼資料
- 傳統範本:在管道程式碼中使用中繼資料
查看工作的串流模式
如要查看工作串流模式,請前往Google Cloud 控制台的「Jobs」(工作) 頁面。
工作詳細資料頁面的「Job info」(工作資訊) 面板也會列出串流模式。
限制
「至少一次」串流模式需要搭配Streaming Engine 和以資源為基礎的計費方式。
定價
「至少一次」模式一律採用資源計費,系統會根據工作耗用的資源總量向您收費。
無論串流模式為何,Streaming Engine 運算單元的單位成本都相同。不過在大多數情況下,使用「至少一次」模式時,管道消耗的總資源會大幅減少。
後續步驟
- 進一步瞭解只處理一次。