全部產品
Search
文件中心

CloudFlow:Global IO,全域變數

更新時間:Apr 03, 2025

在雲工作流程中,資料在多個狀態間傳遞時,每個狀態接收前一狀態的輸出作為輸入。但跨多個狀態傳遞資料時,逐層傳遞變數會增加複雜性。為此,雲工作流程提供了全域變數機制,以簡化跨狀態資料傳遞,提高效率。

使用限制

對於全域變數存在以下限制,如果當前限制不能滿足您的需求,您可以通過工單提交向我們反饋。

限制專案

最大值

變數Key的長度

128 Bytes

變數Value的長度

256 KiB

注意事項

重要
  • GlobalConstructor中引用的$Output是任務(task)的原始輸出值,而非經過OutputConstructor構造後的結果。

  • OutputConstructor中引用的$GlobalGlobalConstructor構造之前的初始值,而非構造完成後的最終值。

上下文大小限制

通過$Global傳遞資料時,InputConstructorOutputConstructor 的輸出仍需要符合上下文大小的限制,即不超過64 KiB。

競態條件

全域變數提供的是Execution層級的全域索引值(key-value)儲存空間,其在整個Execution的生命週期內對於所有狀態(State)都是可讀可寫的,因此當流程存在並行邏輯(比如 Map、Parallel)時,有產生不同狀態之間資料相互覆蓋的可能。建議遵循以下實踐:

  1. 在Parallel的不同分支中寫入全域變數時,使用不同的Key進行寫入。

  2. 避免在Map中對全域變數進行寫入操作。Map不同於Parallel,Map的每個迭代定義都一樣,所以Globalconstructor裡面寫的變數名稱也一樣。如果不同分支都寫入同一個名稱,就會相互覆蓋。

  3. 分布式模式的子執行因為屬於新的Execution,所以不能訪問父執行的Global

通過全域變數傳遞資料

全域變數提供了Execution層級的KVStore for Redis空間,工作流程中的任何狀態都可以在狀態結束時向全域變數寫入資料,以將資料傳遞給其它狀態消費。

在上圖中,狀態A將來自上遊輸入中的$Input.key_a指向的資料通過GlobalConstructor儲存至全域變數中的variable_a,將自身產生的輸出中的$Output.key_b指向的資料通過GlobalConstructor儲存至全域變數中的variable_b。隨後在狀態Z中,通過InputConstructor提取了全域變數中的variable_avariable_b,將其指向的值作為輸入傳遞給了狀態Z,實現了資料的跨狀態傳遞。

雲工作流程的輸入和輸出用於任務間顯式傳遞資料,確保任務的獨立性和清晰性;而全域變數則用於維護跨任務的共用狀態或全域資源配置,兩者結合可以實現高效、靈活的系統設計。上圖將InputConstructorOutputConstructorGlobalConstructor進行對比,詳細解釋如下:

  • 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.HeaderInvokeFunctionResultBody.$: $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鍵中。

  • 函數InvokeFunctionParameters中通過$Global.InvokeFunctionPayload運算式提取了全域儲存空間中的InvokeFunctionPayload鍵對應的值,將其作為body欄位傳遞給Task執行。

  • 函數InvokeFunction通過輸出構造可以查看$Global中的值。image