SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PHPカンファレンス実行委員プレゼンツ PHPの最前線

PHPで並行処理をやってみよう!「Phluxor」で学ぶアクターモデル入門

PHPカンファレンス実行委員プレゼンツ PHPの最前線 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ヒエラルキー構造をもっと活用してみよう

 アクターはヒエラルキー構造は親子関係をもつと同時に、自動で監督する責務を持ちます。その例をすこしだけ紹介します。

 WorldActorを少しだけ変更してみましょう。

src/WorldActor.php
<?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を少しだけ変更してみましょう。

src/HelloActor.php
<?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件の発表が一次採択され、現在は応募者への確認と仮タイムテーブル決めの作業に入っています。 また一般向けの参加登録も始まっています。

 参加費は無料で当日のチケットチェックも特に行いませんが、配布物の数量の目安となるので、参加を予定している方はぜひ登録をお願いします。コンテンツが徐々に決まりはじめ、イベントの見どころや楽しみ方の輪郭が形になってきています。他にも様々な施策を計画していますので、どうぞ参加して楽しんでください。

関連リンク

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
PHPカンファレンス実行委員プレゼンツ PHPの最前線連載記事一覧

もっと読む

この記事の著者

ytake(ワイタケ)

 千株式会社 CTO。Go、Scalaを利用したデータ基盤開発を始め各種アプリケーション開発、アーキテクティング、事業開発やプロダクト開発のサポートやデータ戦略などを担当。マイクロサービスアーキテクチャの支援やドメイン駆動設計導入サポートなどにも携わる。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20281 2024/10/22 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング