指令碼開發 / 函式執行過程
本文主要介紹如何函式被呼叫時的具體任務過程。
1. 基本過程
整體而言,呼叫 DataFlux Func 中的函式時,具體執行的流程如下:
- 使用者發起 HTTP 請求到達 Server
- Server 生成函式執行任務並 Push 到 Redis 佇列
- Worker 從 Redis 佇列 Pop 出函式執行任務並執行
而對於定時執行的任務,則不存在「使用者發起 HTTP 請求」步驟,任務直接由 Beat 服務產生,具體執行流程如下:
- Beat 定時生成函式執行任務並 Push 到 Redis 佇列
- 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