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
service 選項。
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 運算單元的單位成本都相同。不過在大多數情況下,使用「至少一次」模式時,管道消耗的總資源會大幅減少。
後續步驟
- 進一步瞭解只處理一次。