新たなSwift Distributed Actorsパッケージによって、将来のdistributed actor
言語機能がSwiftでどのようになるかを垣間見ることができる。
分散アクターは、Swift 5.5で導入されたローカルアクターを一歩前進させるものだ。分散計算をモデル化するためにローカルアクターを拡張することを目的としている。
私たちは、Swiftで、最先端の分散システムプログラミングをシンプルにして、推進することを目指しています。ローカルアクターを用いた並行プログラミングや、言語に組み込まれているSwiftの構造化並列実行アプローチで行ったのと同じようにです。
ローカルアクターは、async
とawait
で構築されたアブストラクションである。安全な方法でmutableに同時にアクセスしやすくするためのものだ。ローカルアクターは、メソッドが外部から呼び出されたときに、特定のアクセスルールを透過的に適用するための一種のバリアをコンパイラーに提供する。
mutable状態に同時にアクセスするために必要な同期を隠すローカルアクターとは異なり、分散アクターはネットワークの存在を隠すことを目的としていない。むしろ、プログラマーにその機能がリモートの可能性があることを考えてモデル化させる。
分散アクターは(ローカル)アクターに似ています。非同期呼び出しのみを介した通信で状態をカプセル化するためです。分散という側面で、その要素として部分的な独立性、型システム、実行時の考慮事項が加わります。
分散アクターでは、distributed
として宣言されている関数のみをアクターの外部から呼び出すことができる。このような関数はasync
関数として動作するだけでなく、すべての引数と戻り値がCodable
プロトコルに準拠している必要がある。これにより、ネットワーク通信用にエンコード、デコードができる。さらに、すべてのdistributed
関数は、あらゆるネットワークエラーを処理するためにデフォルトでthrow
される。
以下は、分散アクターの現在の仮の構文の例です。
distributed actor Worker {
//-- actor state
var data: SomeData
distributed func work(item: String) -> WorkItem.Result {
// ...
}
}
分散アクターの利点は、シリアル化やその他のネットワークレベルの詳細を処理するための定型コードがほとんどないことにある。これは、ActorTransportのアブストラクションを通して部分的に処理される。ActorTransport
は、init
時に分散アクターにフィードするすべてのネットワーキングを担うライブラリコンポーネントである。
let someTransport: ActorTransport = ...
let worker = Worker(transport: someTransport)
ActorTransport
プロトコルは、Swift標準ライブラリで定義されている。その実装は提供されていない。代わりに、ユーザはユースケースに基づいて独自のActorTransport
準拠コンポーネントを作成できる。
Swiftチームは、SwiftNIOに基づくクラスタトランスポートの実装を提供した。SwiftNIOはクラスタのネットワークレイヤを実装するために、高性能のサーバサイドネットワークライブラリである。このパッケージを使うと、分散アクターはクラスタを形成し、相互に検出し、相互に通信できる。クラスタは、クラスタのライフサイクルを監視できるように、メンバーシップの概念もサポートしている。そして、監視対象のアクターがdeinit
されると監視対象のアクターに通知する。
前述のように、Swiftの分散アクターはまだ進行中の作業だ。ナイトリーツールチェーンを介してのみ利用できる。構文はまだ最終的なものではなく、Swiftチームは、アーリーアダプタがフィードバックを提供し、最終的にSwiftの進化プロセスを通じて最終的な定義へのコントリビューションを推奨している。