在雲工作流程中,資料在多個狀態間傳遞時,每個狀態接收前一狀態的輸出作為輸入。但跨多個狀態傳遞資料時,逐層傳遞變數會增加複雜性。為此,雲工作流程提供了全域變數機制,以簡化跨狀態資料傳遞,提高效率。
使用限制
對於全域變數存在以下限制,如果當前限制不能滿足您的需求,您可以通過工單提交向我們反饋。
限制專案 | 最大值 |
變數Key的長度 | 128 Bytes |
變數Value的長度 | 256 KiB |
注意事項
在
GlobalConstructor中引用的$Output是任務(task)的原始輸出值,而非經過OutputConstructor構造後的結果。在
OutputConstructor中引用的$Global是GlobalConstructor構造之前的初始值,而非構造完成後的最終值。
上下文大小限制
通過$Global傳遞資料時,InputConstructor、OutputConstructor 的輸出仍需要符合上下文大小的限制,即不超過64 KiB。
競態條件
全域變數提供的是Execution層級的全域索引值(key-value)儲存空間,其在整個Execution的生命週期內對於所有狀態(State)都是可讀可寫的,因此當流程存在並行邏輯(比如 Map、Parallel)時,有產生不同狀態之間資料相互覆蓋的可能。建議遵循以下實踐:
在Parallel的不同分支中寫入全域變數時,使用不同的Key進行寫入。
避免在Map中對全域變數進行寫入操作。Map不同於Parallel,Map的每個迭代定義都一樣,所以Globalconstructor裡面寫的變數名稱也一樣。如果不同分支都寫入同一個名稱,就會相互覆蓋。
分布式模式的子執行因為屬於新的
Execution,所以不能訪問父執行的Global。
通過全域變數傳遞資料
全域變數提供了Execution層級的KVStore for Redis空間,工作流程中的任何狀態都可以在狀態結束時向全域變數寫入資料,以將資料傳遞給其它狀態消費。
在上圖中,狀態A將來自上遊輸入中的$Input.key_a指向的資料通過GlobalConstructor儲存至全域變數中的variable_a,將自身產生的輸出中的$Output.key_b指向的資料通過GlobalConstructor儲存至全域變數中的variable_b。隨後在狀態Z中,通過InputConstructor提取了全域變數中的variable_a 和variable_b,將其指向的值作為輸入傳遞給了狀態Z,實現了資料的跨狀態傳遞。
雲工作流程的輸入和輸出用於任務間顯式傳遞資料,確保任務的獨立性和清晰性;而全域變數則用於維護跨任務的共用狀態或全域資源配置,兩者結合可以實現高效、靈活的系統設計。上圖將InputConstructor、OutputConstructor和GlobalConstructor進行對比,詳細解釋如下:
InputConstructor($Context,$Global)、OutputConstructor($Context,$Global)和GlobalConstructor($Context,$Global)表示輸入、輸出和全域構造器都可以引用$Context和$Global,從中提取資訊。$Global=Merge($Global,GlobalConstructor($Context,$Global))表示把全域構造器構造出的變數和$Global中已有的變數合并,存放在$Global中,更新共用的全域變數。圖中
$Output表示Task調用之後的返回結果,如果Task的調用是非同步回調模式,那麼$Output取值就是回調之後的返回結果。圖中
$Global用於表示全域變數,其在整個工作流程執行過程中都是可訪問的。
全域變數的建立和更新
全域變數的建立和更新通過GlobalConstructor完成,在狀態執行結束時,會觸發GlobalConstructor執行。以下狀態機器定義樣本顯示了全域構造器的用法:
Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: >-
acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
invocationType: Sync
body.$: $Input
GlobalConstructor:
InvokeFunctionResultHeader.$: $Output.Header
InvokeFunctionResultBody.$: $Output.Body
End: true全域構造器
GlobalConstructor的資料結構為map[string]any。InvokeFunctionResultHeader.$: $Output.Header和InvokeFunctionResultBody.$: $Output.Body表示將函數調用的傳回值中的Header 和Body分別儲存在全域變數中的 InvokeFunctionResultHeader 和 InvokeFunctionResultBody 兩個鍵中。
全域變數的讀取
雲工作流程定義了$Global關鍵字用於全域變數的讀取。在任何支援運算式構造的情境,都可以通過$Global訪問當前Execution的全域儲存空間,狀態可以通過明確的鍵提取全域儲存空間中的值。以下狀態機器定義樣本顯示了$Global的用法:
Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction1
States:
- Type: Task
Name: InvokeFunction1
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
invocationType: Sync
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
GlobalConstructor:
InvokeFunctionPayload.$: $Output.Body
Next: InvokeFunction
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
invocationType: Sync
body.$: $Global.InvokeFunctionPayload
OutputConstructor:
demo.$: $Global
End: true
函數
InvokeFunction在狀態執行結束時,執行GlobalConstructor,將函數InvokeFunction1調用的傳回值中的Body存在全域變數的InvokeFunctionPayload鍵中。函數
InvokeFunction在Parameters中通過$Global.InvokeFunctionPayload運算式提取了全域儲存空間中的InvokeFunctionPayload鍵對應的值,將其作為body欄位傳遞給Task執行。函數
InvokeFunction通過輸出構造可以查看$Global中的值。