跳转至

脚本开发 / 函数执行过程

本文主要介绍如何函数被调用时的具体任务过程。

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
    用户 --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