스크립트 개발 / 함수 실행 과정
이 문서에서는 함수가 호출될 때의 구체적인 작업 과정을 주로 소개합니다.
1. 기본 과정
전체적으로 DataFlux Func에서 함수를 호출할 때, 구체적으로 실행되는 흐름은 다음과 같습니다:
- 사용자가 HTTP 요청을 보내 Server에 도달합니다
- Server가 함수 실행 작업을 생성하여 Redis 큐에 Push합니다
- Worker가 Redis 큐에서 함수 실행 작업을 Pop하여 실행합니다
한편 Cron Job으로 실행되는 작업의 경우 '사용자가 HTTP 요청을 보내는' 단계가 없으며, 작업은 Beat 서비스에서 직접 생성됩니다. 구체적인 실행 흐름은 다음과 같습니다:
- Beat가 정기적으로 함수 실행 작업을 생성하여 Redis 큐에 Push합니다
- 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