ルーターは、メッセージをルーティー(routees/ルート対象)として作用するアクターにルーティングする
特殊なタイプのアクターです。
ルーターによって、メッセージを効率的にルーティングするための戦略が異なります。
ルーターはアクターの内側でも外側でも使用でき、
ルーティーを自分で管理することも、
構成機能を備えた自己完結型のルーターアクターを使用することもできます。
Phluxorでは、あらかじめ用意されているルーターを使用して、
アプリケーションの要件に合わせたルーティングを行うことができます。
もちろん、独自のルーターを作成することもできます。
ルーターに送信されたメッセージは、そのルーターのルーティーの1つに転送されますが、
例外がひとつだけあります。
特別な Phluxor\Router\Message\Broadcast
を用いるとすべてのルーティング先に送信されます。
ラウンドロビンルーターを使用して5つのワーカーを展開する例を示します。
use Phluxor\ActorSystem;
use Phluxor\Router\RoundRobin\PoolRouter;
$system = ActorSystem::create();
$props = PoolRouter::create(
5,
ActorSystem\Props::withProducer(fn() => $this->noneActor())
);
$router = $system->root()->spawn($props);
Phluxorには、次の2つのタイプのルーカーがあります。
プールは、インスタンスの数をパラメーターとしてルーターに提供し、
ルーターがルーティー(アクター)の作成を独自に行うタイプです。
グループは、プールとは異なり、
ルーターにルーティー(アクター)のリストを提供するタイプです。
意図的にルーティーを作成する必要がある場合は、
ルーティーとして使用するアクターを作成し、
アクターリファレンスであるRef
をグループルーターに渡します。
ルーターはアクターとして実装されるため、
通常のアクターと同様にルーターは親によって監視され子も監視できます。
グループルーターは別の場所で任意で作成されたルート先を使用します。
ルート先は子アクターとはならないため、
ルート先が停止した場合はグループルーターが子アクターを認識しなくなります。
一方でプールルーターは内部で独自の子アクターを作成します。
そのためこれまでの階層構造と同様にルーターはルート先のスーパーバイザーとなります。