コンテンツにスキップ

スクリプト開発 / 関数実行プロセス

本稿では、関数が呼び出されたときの具体的なタスクプロセスを主に紹介します。

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 に接続されているため、各タスクは、いずれか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