Phluxor

Spawning Actors

アクターは任意の数のアクターを生成できます。

生成されたアクターは子アクターとなり、それぞれがさらに自分の子アクターを生成できます。
(この場合、生成したアクターが親アクターとなります)

これにより、アクターは階層構造を持つことができます。

ActorSystemはこの階層のホストとして機能し、その直下に生成されるルートアクターはトップレベルのアクターとなります。

子アクターのライフサイクルは親アクターのライフサイクルに依存します。

子アクターはいつでも停止や再起動が可能ですが、
親アクターが停止するとその子アクターも停止するため、子アクターが親アクターを超えて存続することはできません。

Spawn

アクターを生成する際、ルートアクターはroot()から作成され、子アクターはcontextから作成されます。

子アクターやルートアクターを作成するには、spawnメソッドを使用します。

最初のパラメーターはPhluxor\ActorSystem\Propsオブジェクトです。 自動生成された名前でアクターを生成します。

*Propsはアクターを作成するための構成オブジェクトです。

root

use Phluxor\ActorSystem;
use Phluxor\ActorSystem\Props;

$system = ActorSystem::create();

$spawned = $system->root()->spawn(
    Props::fromProducer(
        fn() => new YourActor()
    )
);

child

namespace App\ActorSystem;

use App\Command\CreateUser;
use Phluxor\ActorSystem\Context\ContextInterface;
use Phluxor\ActorSystem\Message\ActorInterface;
use Phluxor\ActorSystem\Props;

class YourActor implements ActorInterface
{
    public function receive(ContextInterface $context): void
    {
        if ($msg instanceof CreateUser) {
            $context->spawn(
                Props::fromProducer(
                    fn() => new YourChildActor()
                )
            );
        }
    }
}

ルートアクターと子アクターを生成する方法は同じです。

SpawnNamed

spawnNamedメソッドは、名前付きアクターを作成するために使用されます。

2番目のパラメーターにはユニークな名前が必要です。

事前に名前を付けてアクターを作成することで、

意図したアクターにメッセージを送信したり、状態をより簡単に管理できます。

もしその名前がすでに使用されている場合は、

例外(Phluxor\ActorSystem\Exception\NameExistsException)がスローされます。

namespace App\ActorSystem;

use App\Command\CreateUser;
use Phluxor\ActorSystem\Context\ContextInterface;
use Phluxor\ActorSystem\Message\ActorInterface;
use Phluxor\ActorSystem\Props;

class YourActor implements ActorInterface
{
    public function receive(ContextInterface $context): void
    {
        if ($msg instanceof CreateUser) {
            $context->spawnNamed(
                Props::fromProducer(
                    fn() => new YourChildActor()
                ),
                'unique-name'
            );
        }
    }
}

SpawnPrefix

spawnPrefixメソッドは、プレフィックス付きのアクターを作成するために使用されます。

プレフィックスはアクターの名前に追加されます。

namespace App\ActorSystem;

use App\Command\CreateUser;
use Phluxor\ActorSystem\Context\ContextInterface;
use Phluxor\ActorSystem\Message\ActorInterface;
use Phluxor\ActorSystem\Props;

class YourActor implements ActorInterface
{
    public function receive(ContextInterface $context): void
    {
        if ($msg instanceof CreateUser) {
            $context->spawnPrefix(
                Props::fromProducer(
                    fn() => new YourChildActor()
                ),
                'prefix-'
            );
        }
    }
}