脚本开发 / 函数执行过程
本文主要介绍如何函数被调用时的具体任务过程。
1. 基本过程
整体而言,调用 DataFlux Func 中的函数(授权链接、批处理)时,具体执行的流程如下:
- 用户发起 HTTP 请求到达 Server
- Server 生成函数执行任务并 Push 到 Redis 队列
- Worker 从 Redis 队列 Pop 出函数执行任务并执行
而对于定时执行的任务,则不存在「用户发起 HTTP 请求」步骤,任务直接由 Beat 服务产生,具体执行流程如下:
- Beat 定时生成函数执行任务并 Push 到 Redis 队列
- Worker 从 Redis 队列 Pop 出函数执行任务并执行
2. 单机部署
对于单机部署的 DataFlux Func,整个流程非常简单:
flowchart TB
用户 --HTTP 请求--> Server
Server --函数执行任务入队--> Redis队列
Redis队列 --函数执行任务出队--> Worker
Beat --"函数执行任务入队\n(定时)"--> Redis队列
2. 多副本部署
对于多副本部署的 DataFlux Func 来说,由于存在 SLB(或其他反向代理服务),任意一个 Server 都有可能接收到请求。
同时,由于每个副本连接到相同的 Redis,因此每个任务只会被任意一个 Worker 获取并执行:
flowchart TB
用户 --HTTP 请求--> SLB
SLB --HTTP 转发--> Server1
SLB -.-> Server2
Server1 --函数执行任务入队--> Redis队列
Server2 -.-> Redis队列
Redis队列 -.-> Worker1
Redis队列 --函数执行任务出队--> Worker2
Beat --"函数执行任务入队\n(定时)"--> Redis队列
3. 完全独立的主备部署
某些情况下,如果需要实现「完全独立的主备部署」,那么可以进一步将 Redis 进行拆分,并在 SLB(或其他反向代理服务器)中将主备节点权重比设置为 100:0。
此时,由于主备节点之间完全独立,各自都是完全独立运行的 DataFlux Func,如果同时启动了主备节点上的 DataFlux Func,会导致定时任务重复执行。因此,可以在平时将备用节点的 DataFlux Func 关闭,或在脚本中自行编写避免任务重复执行的处理。
flowchart TB
用户 --HTTP 请求--> SLB
SLB --HTTP 转发--> 主节点Server
SLB -.-> 备用节点Server
subgraph 备用节点
direction TB
备用节点Server --函数执行任务入队--> 备用节点Redis队列
备用节点Redis队列 --函数执行任务出队--> 备用节点Worker
备用节点Beat --"函数执行任务入队\n(定时)"--> 备用节点Redis队列
end
subgraph 主节点
direction TB
主节点Server --函数执行任务入队--> 主节点Redis队列
主节点Redis队列 --函数执行任务出队--> 主节点Worker
主节点Beat --"函数执行任务入队\n(定时)"--> 主节点Redis队列
end