脚本开发 / 函数执行过程
本文主要介绍如何函数被调用时的具体任务过程。
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