本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
SEQUENTIAL_EXECUTOR
使用情況
會依序SEQUENTIAL_EXECUTOR執行一系列函數。每個步驟都可以使用前步驟的結果。
當您的邏輯需要依賴彼此結果的多個步驟SEQUENTIAL_EXECUTOR時,請使用 。常見的使用案例包括擷取身分資料,然後使用它來擷取受眾客群、執行分類步驟,然後根據結果有條件地呼叫不同的外部服務,以及從多個資料來源建置複雜的廣告請求 URLs。
組態欄位
SEQUENTIAL_EXECUTOR 函數具有下列欄位:
-
執行時間 — 表達式語言。將此設定為
JSONATA。 -
FunctionList — 1 到 10 個步驟的排序清單。每個步驟都會指定要執行之函數
FunctionId的 。或者,您可以新增RunCondition表達式來控制步驟是否執行或略過。 -
輸出 — 定義所有步驟完成後要產生的值。每個項目都會將輸出索引鍵 (例如
player_params.envelope) 映射到可以參考序列中任何步驟所產生的資料的表達式。如果省略,則會使用序列中個別函數的所有輸出。 -
TimeoutMilliseconds (必要) — 整個序列完成的時間上限。如果序列超過此逾時,MediaTailor 會捨棄序列中的所有輸出。
排序的執行和資料流程
MediaTailor 會從第一個到最後一個依序執行每個步驟。每個步驟完成後,其產生的值會合併到一組執行中的結果中。後續步驟可以存取原始工作階段資料,以及先前步驟所產生的所有值。
暫時資料是在步驟之間傳遞資料的主要機制。當函數寫入temp.*金鑰時,下一個步驟可以讀取該值。玩家參數和先前步驟撰寫的廣告請求欄位,也會在後續步驟中顯示。
注意
暫時資料接受任何資料類型,包括物件和陣列。玩家參數和廣告請求欄位僅接受字串、數字、布林值和 null)。
每個步驟的執行條件
序列中的每個步驟都有一個選用RunCondition欄位。此欄位包含傳回 true或 的表達式false。MediaTailor 會在執行該步驟之前立即評估RunCondition運算式。
如果RunCondition表達式評估為 false,MediaTailor 會完全略過步驟並移至下一個步驟。如果省略 RunCondition 欄位,則步驟一律會執行。
{ "FunctionId": "retryFetch", "RunCondition": "{%temp.statusCode = 500%}" }
此機制可讓您建置條件式管道。例如,您可以在步驟 1 中執行身分擷取,然後只有在步驟 1 傳回有效的身分時,才會有條件地在步驟 2 中執行區段查詢。
輸出區塊的運作方式
序列上的輸出區塊SEQUENTIAL_EXECUTOR控制在所有步驟完成後產生的項目:
-
輸出區塊存在 — MediaTailor 會根據最終累積狀態評估輸出區塊中的表達式,並僅儲存這些輸出。順序輸出區塊中未參考的先前步驟所產生的任何輸出都會遭到捨棄。
-
輸出區塊不存在 — MediaTailor 會直接從所有步驟儲存所有累積的輸出。
提示
當您希望每個函數的輸出通過時,請省略輸出區塊。當您在儲存之前需要篩選、重新命名或轉換累積的結果時,請新增輸出區塊。
逾時組態
TimeoutMilliseconds 欄位會設定整個序列的截止日期。此逾時涵蓋所有步驟,包括 函數所做的任何 HTTP 呼叫。如果序列超過逾時,MediaTailor 會捨棄序列中的所有輸出,並像未連接函數一樣繼續。
個別HTTP_REQUEST函數仍然遵守自己的RequestTimeoutMilliseconds設定。序列逾時可做為限制總執行時間的外部界限。
範例:HTTP 失敗時重試
此範例會呼叫身分 API,並在第一次呼叫傳回伺服器錯誤時自動重試。它使用兩個由 SEQUENTIAL_EXECUTOR 協調的 HTTP_REQUEST 函數。
步驟 1 — 主要擷取 (fetchIdentity):
{ "FunctionId": "fetchIdentity", "FunctionType": "HTTP_REQUEST", "HttpRequestConfiguration": { "Runtime": "JSONATA", "MethodType": "GET", "Url": "{%'https://identity.example.com/v1/resolve?ip=' & session.client_ip%}", "Headers": { "Accept": "application/json" }, "RequestTimeoutMilliseconds": 1000, "Output": { "temp.statusCode": "{%response.statusCode%}", "temp.envelope": "{%response.statusCode = 200 ? response.body.envelope : null%}" } } }
步驟 2 — 在失敗時重試 (retryIdentity):
{ "FunctionId": "retryIdentity", "FunctionType": "HTTP_REQUEST", "HttpRequestConfiguration": { "Runtime": "JSONATA", "MethodType": "GET", "Url": "{%'https://identity-fallback.example.com/v1/resolve?ip=' & session.client_ip%}", "Headers": { "Accept": "application/json" }, "RequestTimeoutMilliseconds": 1000, "Output": { "temp.statusCode": "{%response.statusCode%}", "temp.envelope": "{%response.statusCode = 200 ? response.body.envelope : null%}" } } }
序列 (identityWithRetry):
{ "FunctionId": "identityWithRetry", "FunctionType": "SEQUENTIAL_EXECUTOR", "SequentialExecutorConfiguration": { "Runtime": "JSONATA", "TimeoutMilliseconds": 2000, "FunctionList": [ { "FunctionId": "fetchIdentity" }, { "FunctionId": "retryIdentity", "RunCondition": "{%temp.statusCode >= 500%}" } ], "Output": { "player_params.envelope": "{%temp.envelope%}" } } }
運作方式:
-
fetchIdentity會呼叫身分 API,並將狀態碼和信封寫入temp.*。 -
如果狀態碼為 500 或更高,步驟 2
RunCondition上的 會評估為true並retryIdentity執行。它會temp.envelope使用重試回應覆寫temp.statusCode和 。 -
如果第一次呼叫成功,則會略過步驟 2。
-
序列輸出區塊
temp.envelope會寫入player_params.envelope。