スクリプト開発 / 関数実行プロセス
本稿では、関数が呼び出されたときの具体的なタスクプロセスを主に紹介します。
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 に接続されているため、各タスクは、いずれか1つの 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