ヒエラルキー構造をもっと活用してみよう
アクターはヒエラルキー構造は親子関係をもつと同時に、自動で監督する責務を持ちます。その例をすこしだけ紹介します。
WorldActorを少しだけ変更してみましょう。
<?php declare(strict_types=1); namespace Sample; use Phluxor\ActorSystem\Context\ContextInterface; use Phluxor\ActorSystem\Message\ActorInterface; class WorldActor implements ActorInterface { public function receive(ContextInterface $context): void { $message = $context->message(); if ($message instanceof Message\HelloRequest) { $context->poison($context->self()); } } }
コンテキストのpoison
メソッドを利用することで、アクターを停止できます。意図的な停止であれば問題ありませんが、親アクターは子アクターの停止を簡単に検知できます。
HelloActorを少しだけ変更してみましょう。
<?php declare(strict_types=1); namespace Sample; use Phluxor\ActorSystem\Context\ContextInterface; use Phluxor\ActorSystem\Message\ActorInterface; use Phluxor\ActorSystem\Props; use Phluxor\ActorSystem\ProtoBuf\Terminated; use Phluxor\ActorSystem\Ref; class HelloActor implements ActorInterface { private ?Ref $sender = null; public function receive(ContextInterface $context): void { $message = $context->message(); switch (true) { case $message instanceof Message\HelloRequest: $this->sender = $context->sender(); $ref = $context->spawn( Props::fromProducer(fn() => new WorldActor()) ); $context->request($ref, $message); break; case $message instanceof Message\HelloResponse: $context->send($this->sender, $message); break; case $message instanceof Terminated: var_dump($message->getWho()->getId()); break; } } }
Phluxor\ActorSystem\ProtoBuf\Terminated
はアクターが停止したことを示すシステムメッセージです。このメッセージを受信した場合には、停止したアクターの情報を取得できるようになっています。
例にあるように子アクターの停止は親アクターに通知されるようになっていますので、親アクターは子アクターの停止を検知し、必要に応じて再生成するなどの処理を行うことができます。
ほかにもクラッシュしたアクターの対処や、リトライ処理などもアクターモデルを利用することで簡単に実装できます。
アクターモデルはアクターが独立して動作することを前提としているため、アクターがクラッシュしても他のアクターに影響を与えることはありません。
それではWorldActorをクラッシュさせてみましょう。
PhluxorではExceptionをスローすることでアクターをクラッシュさせることができます。
<?php declare(strict_types=1); namespace Sample; use Phluxor\ActorSystem\Context\ContextInterface; use Phluxor\ActorSystem\Message\ActorInterface; class WorldActor implements ActorInterface { public function receive(ContextInterface $context): void { $message = $context->message(); if ($message instanceof Message\HelloRequest) { throw new \Exception('Let it crash'); } } }
これまでと同様にCLIからを実行すると下記のように表示されます。
recovering
と表示されている部分はアクターがクラッシュした際に再生成されることを示しています。つまり子アクターが自動で再生成されていることを意味します。
クラッシュ時にどのような処理を行うかは任意でアクターに割り当てることができますので、柔軟な復旧処理を行うことができます。
デフォルトではアクターは再生成されますが、再生成せずに停止させることも、再起動時の時間を徐々に遅らせることも可能です。
これらの仕組みはHTTPリクエストの失敗や、データベースの接続エラーなど、アプリケーションで発生するエラーやリトライ処理に対しても活用できます。
これらもアクターモデルの特徴のひとつであり、アクターモデルを利用するメリットのひとつでもあります。
さいごに
PHPを通じてアクターモデルの基本的な動作を少しだけ紹介しました。これまでのPHPではあまり見かけないプログラミングスタイルとなっていますが、アクターモデルを利用することで非同期処理や並行処理を意識することなく実装できるようになります。
Phluxorはアクターモデルのツールキットであり、コルーチンが利用可能なWebアプリケーションフレームワークであれば簡単に連携できます。
これまでPHPだけでは難しかった処理も実現できるようになり、状態の復元やリトライ処理、マイクロサービスアーキテクチャをはじめとする分散処理やCQRS+ESなどもアクターモデルを利用することで実現できるようになります。
最初は少しばかり難しいかもしれませんが、アクターモデルを利用することでPHPの新たな可能性を広げることができるかもしれません。興味のある方はPhluxorや他言語でも提供されているツールキットなどを介してアクターモデルに触れてみてください。
ようこそ、アクターモデルの世界へ。
PHPカンファレンス2024 実行委員より
2024年12月22日(日)に開催される日本のPHPコミュニティの最大のお祭り「PHPカンファレンス2024」では、発表者を広く一般から募集しています。9月7日に応募締切があり合計260件の発表申し込みがありました。応募数は昨年の234件よりも多く、今年のPHPコミュニティの盛り上がりを反映しているように思えます。その中から45件の発表が一次採択され、現在は応募者への確認と仮タイムテーブル決めの作業に入っています。 また一般向けの参加登録も始まっています。
参加費は無料で当日のチケットチェックも特に行いませんが、配布物の数量の目安となるので、参加を予定している方はぜひ登録をお願いします。コンテンツが徐々に決まりはじめ、イベントの見どころや楽しみ方の輪郭が形になってきています。他にも様々な施策を計画していますので、どうぞ参加して楽しんでください。