跳轉至

腳本開發 / 函數執行過程

本文主要介紹如何函數被調用時的具體任務過程。

1. 基本過程

整體而言,調用 DataFlux Func 中的函數時,具體執行的流程如下:

  1. 用户發起 HTTP 請求到達 Server
  2. Server 生成函數執行任務並 Push 到 Redis 隊列
  3. Worker 從 Redis 隊列 Pop 出函數執行任務並執行

而對於定時執行的任務,則不存在「用户發起 HTTP 請求」步驟,任務直接由 Beat 服務產生,具體執行流程如下:

  1. Beat 定時生成函數執行任務並 Push 到 Redis 隊列
  2. Worker 從 Redis 隊列 Pop 出函數執行任務並執行

2. 單機部署

對於單機部署的 DataFlux Func,整個流程非常簡單:

flowchart TB
    USER[用户]
    SERVER[Server]
    WORKER[Worker]
    REDIS_QUEUE[Redis隊列]

    USER --HTTP 請求--> SERVER
    SERVER --函數執行任務入隊--> REDIS_QUEUE
    REDIS_QUEUE --函數執行任務出隊--> WORKER

    Beat --"函數執行任務入隊\n(定時)"--> REDIS_QUEUE

2. 多副本部署

對於多副本部署的 DataFlux Func 來説,由於存在 SLB(或其他反向代理服務),任意一個 Server 都有可能接收到請求。

同時,由於每個副本連接到相同的 Redis,因此每個任務只會被任意一個 Worker 獲取並執行:

flowchart TB
    USER[用户]
    SERVER_1[Server 1]
    SERVER_2[Server 2]
    WORKER_1[Worker 1]
    WORKER_2[Worker 2]
    REDIS_QUEUE[Redis隊列]

    USER --HTTP 請求--> SLB
    SLB --HTTP 轉發--> SERVER_1
    SLB -.-> SERVER_2
    SERVER_1 --函數執行任務入隊--> REDIS_QUEUE
    SERVER_2 -.-> REDIS_QUEUE
    REDIS_QUEUE -.-> WORKER_1
    REDIS_QUEUE --函數執行任務出隊--> WORKER_2

    Beat --"函數執行任務入隊\n(定時)"--> REDIS_QUEUE

3. 完全獨立的主備部署

某些情況下,如果需要實現「完全獨立的主備部署」,那麼可以進一步將 Redis 進行拆分,並在 SLB(或其他反向代理服務器)中將主備節點權重比設置為 100:0。

此時,由於主備節點之間完全獨立,各自都是完全獨立運行的 DataFlux Func,如果同時啓動了主備節點上的 DataFlux Func,會導致定時任務重複執行。因此,可以在平時將備用節點的 DataFlux Func 關閉,或在腳本中自行編寫避免任務重複執行的處理。

flowchart TB
    USER[用户]
    MAIN_NODE_SERVER[主節點 Server]
    MAIN_NODE_WORKER[主節點 Worker]
    MAIN_NODE_BEAT[主節點 Beat]
    MAIN_NODE_REDIS_QUEUE[主節點 Redis 隊列]
    BACKUP_NODE_SERVER[備用節點 Server]
    BACKUP_NODE_WORKER[備用節點 Worker]
    BACKUP_NODE_BEAT[備用節點 Beat]
    BACKUP_NODE_REDIS_QUEUE[備用節點 Redis 隊列]

    USER --HTTP 請求--> SLB
    SLB --HTTP 轉發--> MAIN_NODE_SERVER
    SLB -.-> BACKUP_NODE_SERVER

    subgraph 備用節點
        direction TB
        BACKUP_NODE_SERVER --函數執行任務入隊--> BACKUP_NODE_REDIS_QUEUE
        BACKUP_NODE_REDIS_QUEUE --函數執行任務出隊--> BACKUP_NODE_WORKER

        BACKUP_NODE_BEAT --"函數執行任務入隊\n(定時)"--> BACKUP_NODE_REDIS_QUEUE
    end

    subgraph 主節點
        direction TB
        MAIN_NODE_SERVER --函數執行任務入隊--> MAIN_NODE_REDIS_QUEUE
        MAIN_NODE_REDIS_QUEUE --函數執行任務出隊--> MAIN_NODE_WORKER

        MAIN_NODE_BEAT --"函數執行任務入隊\n(定時)"--> MAIN_NODE_REDIS_QUEUE
    end