Game > GameAnvil > サーバー概念の説明 > ファイバー

ファイバー(Fiber)

ファイバーは、一種の軽量ユーザースレッド(Lightweight User Thread)であり、GameAnvilサーバーコードの基本フロー単位です。前述したノードのシングルスレッドは多数のセッション、ユーザー、そしてルームなどを同時に効果的に処理するために、再び多数のファイバーにコードフローが分かれます。つまり、GameAnvilはファイバーベースのContinuationをサポートします。

多数のファイバーは、スレッドプール(Executor)上でスケジューリングされます。この時、スレッドプールのサイズを1に固定すると、直ちにGameAnvilノードのモデルとなります。つまり、ノードは多数のファイバーを同時に処理するためのアノテーション(annotation)スケジューラです。これを図で表現すると下記のようになります。

image.png

このようにファイバーを使用する際のメリットは、逐次的なコード作成が可能な点です。サーバーコードは、一般的なブロッキングコードを作成する過程と非常によく似ています。別途のコールバック処理や完了通知に気を使う必要が全くありません。このようなファイバーのメリットに加え、GameAnvilユーザーは、このファイバー単位にも気を使う必要がありません。GameAnvilエンジンですべてのファイバーを管理しているため、ユーザーは一般的なシングルスレッドコードを作成するように開発できます。

fiber-context-switching.png

GameAnvilサーバーコードは非同期処理をベースにしているため、非同期サポートAPIを提供します。このような非同期APIを使用して任意のファイバー上でブロッキングを呼び出す場合は、該当のファイバーのみsuspend(待機状態)になります。詳細については以下をご覧ください。

ファイバーベースの非同期処理(Asynchronous on fibers)

コードはファイバー上で非同期で処理される必要があります。つまり、1つのファイバーで任意の時間を要するI/O呼び出しをする場合、該当ファイバーは呼び出しが完了するまで実行権限を他のファイバーに譲渡できます。さらに、スレッドブロッキング呼び出しであっても、これをファイバーブロッキング呼び出しに切り替えて非同期化できるようにAPIを提供します。つまり、スレッドブロッキング呼び出しは、必ず非同期サポートAPIを使用して処理する必要があり、もしこれを破り、直接呼び出した場合は、該当スレッドがブロックされ、その結果、スレッド上のすべてのファイバーがブロックされ、ノード全体が停止します。

    void someProblematicMethod() {

        someThreadBlockingCall(); // 該当ファイバーだけでなくスレッド全体がブロックされます!

    }

これについては実装方法の非同期サポートで詳しく説明しています。

TOP