Phluxor

Context

Phluxorには2つのコンテキストがあります。

Phluxor\ActorSystem\ActorContextPhluxor\ActorSystem\RootContextです。

これらの2つのコンテキストは、SpawnerStopperInfomationSenderなどの共通機能を実装しています。

さらに、ActorContextには追加の機能が実装されています。

Spawner

Phluxor\ActorSystem\ActorContextPhluxor\ActorSystem\RootContextには、spawnメソッドがあります。

SpawnerPhluxor\ActorSystem\Propsオブジェクトから新しいアクターを作成する機能です。

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

<?php

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

$system = ActorSystem::create();

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

Props についてもしっかり理解しておきましょう。

Stopper

Phluxor\ActorSystem\ActorContextPhluxor\ActorSystem\RootContextには、stopメソッドがあります。

アクターを即座に停止させる、または現在のメールボックスメッセージの処理後に停止を指示する機能です。

stoppoisonにはいくつかのメソッドがありますが、

これらのメソッドには引数としてPhluxor\ActorSystem\Refオブジェクトが必要です。

<?php

use Phluxor\ActorSystem\Context\ContextInterface;
use Phluxor\ActorSystem\Message\ActorInterface;
use Phluxor\ActorSystem\ProtoBuf\Pid
use Phluxor\ActorSystem\Ref;

class YourActor implements ActorInterface
{
    public function receive(ContextInterface $context): void
    {
        $msg = $context->message();
        $context->stop($context->sender());
        $context->stop($context->self());
        $context->stop(new Ref(new ActorSystem\ProtoBuf\Pid([
            'id' => 'actor name',
        ])));
    }
}

Information

infoはメソッドではなく、アクターに関する情報を提供する機能です。

Phluxor\ActorSystem\ActorContextPhluxor\ActorSystem\RootContextにはアクターの情報に関する機能があります。

現在のアクターの親アクター、現在のアクターのPhluxor\ActorSystem\Ref
メッセージ送信元のアクターのPhluxor\ActorSystem\Ref
アクターが存在するPhluxor\ActorSystemなど、コンテキストの情報を取得できます。

<?php

use Phluxor\ActorSystem\Context\ContextInterface;
use Phluxor\ActorSystem\Message\ActorInterface;
use Phluxor\ActorSystem\ProtoBuf\Pid
use Phluxor\ActorSystem\Ref;

class YourActor implements ActorInterface
{
    public function receive(ContextInterface $context): void
    {
        $msg = $context->message(); // get message
        $context->sender(); // get sender Ref
        $context->self(); // get self Ref
        $contex->parent(); // get parent Ref
        $context->actorSystem(); // get actor system
        $context->logger(); // get logger
        // etc...
    }
}

Sender

Phluxor\ActorSystem\ActorContextPhluxor\ActorSystem\RootContextには、senderメソッドがあります。

sendメソッドは、fire-and-forgetスタイルでメッセージを送信し、
requestメソッドは、宛先アクターに非同期で応答をリクエストする機能を提供します。

<?php

use Phluxor\ActorSystem\Context\ContextInterface;
use Phluxor\ActorSystem\Message\ActorInterface;
use Phluxor\ActorSystem\ProtoBuf\Pid
use Phluxor\ActorSystem\Ref;

class YourActor implements ActorInterface
{
    // implement receive method
    public function receive(ContextInterface $context): void
    {
        // example - make a actor reference
        $pid = new Ref(new Pid([
            'id' => 'otherActor',
        ]));
        // Of course, 
        // you can also use the spawn method to create an actor reference.
        // fire-and-forget style message
        $context->send($pid, new YourMessage('hello'));
        // request style message
        $context->request($pid, new YourMessage('hello'));
        // future style message
        $context->requestFuture($pid, new YourMessage('hello'), 1);
    }
}

Receiver

Phluxor\ActorSystem\ActorContextのみの機能です。

receiveメソッドは、Phluxor\ActorSystem\Message\MessageEnvelopeでラップされたメッセージを受信する機能を提供します。

<?php

use Phluxor\ActorSystem\Context\ContextInterface;
use Phluxor\ActorSystem\Message\ActorInterface;
use Phluxor\ActorSystem\ProtoBuf\Pid
use Phluxor\ActorSystem\Ref;

class YourActor implements ActorInterface
{
    // implement receive method
    public function receive(ContextInterface $context): void
    {
        $context->receive($envelope);
    }
}

Supervisor

Phluxor\ActorSystem\ActorContextのみの機能です。

Supervisionは、現在のアクターの監視下にある子アクターのライフサイクルを制御するためのメソッドを提供し、
階層構造の監視において障害を次のアクターにエスカレーションする機能を提供します。

supervisionについてもしっかり理解しておきましょう。