跳转至

脚本开发 / 函数执行过程

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

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