Skip to content

스크립트 개발 / 함수 실행 과정

이 문서에서는 함수가 호출될 때의 구체적인 작업 과정을 주로 소개합니다.

1. 기본 과정

전체적으로 DataFlux Func에서 함수를 호출할 때, 구체적으로 실행되는 흐름은 다음과 같습니다:

  1. 사용자가 HTTP 요청을 보내 Server에 도달합니다
  2. Server가 함수 실행 작업을 생성하여 Redis 큐에 Push합니다
  3. Worker가 Redis 큐에서 함수 실행 작업을 Pop하여 실행합니다

한편 Cron Job으로 실행되는 작업의 경우 '사용자가 HTTP 요청을 보내는' 단계가 없으며, 작업은 Beat 서비스에서 직접 생성됩니다. 구체적인 실행 흐름은 다음과 같습니다:

  1. Beat가 정기적으로 함수 실행 작업을 생성하여 Redis 큐에 Push합니다
  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