腳本開發 / 函數執行過程
本文主要介紹如何函數被調用時的具體任務過程。
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