概要
swift-erlang-actor-system は、Swiftの分散アクターでErlangクラスタに参加できる新しいアクターシステム。 Erlangの「Cノード」機能をSwift向けにラップし、Elixir/Erlangノードと通信可能。 Elixir や Erlang との連携例や導入手順を紹介。 メッセージシリアライズや @StableNames による関数名安定化に対応。 SwiftとErlang間の分散システム連携を容易にする設計。
swift-erlang-actor-system 概要と特徴
- swift-erlang-actor-system は、SwiftプログラムがErlangクラスタへ参加可能なアクターシステム
- Erlang の分散ノード(runtime)や Cノード 機能をSwift用にラップ
- Swiftの分散アクター機能と組み合わせて、Erlang/Elixirノードと相互通信可能
- 例として、Swift製のチャットプログラムをElixirノードから操作可能
- Elixir/Erlang とSwift間でのプロセス間通信を簡単に実現
導入手順
- Elixir をインストール(macOSなら
brew install elixir) - epmd(Erlang Port Mapper Daemon) を起動しノード発見をサポート
- Elixirノードを起動し、 cookie と ホスト名 を取得
- コマンド例:
iex --sname elixir_node Node.get_cookie()でcookie確認
- コマンド例:
- Swiftパッケージに
otp-interop/swift-erlang-actor-systemを依存追加 - サンプルアクター(例: Counter)を作成し、ErlangActorSystemでノード初期化
- 他ノードへの接続やアクター登録を実施し、Elixirから操作可能に
- 例:
GenServer.cast({:counter, :"swift_node@YOUR_HOSTNAME"}, :increment)
- 例:
技術的詳細
- ネットワーク・シリアライズ にはErlang/OTPの
erl_interfaceCライブラリを利用- Swiftパッケージ内でCターゲットとして同梱
- Transport を差し替えることでWebSocket等カスタム通信も可能
- メッセージのシリアライズはDistributed Erlangの External Term Format を採用
TermEncoder/TermDecoderクラスでSwiftのCodable型を変換swift-binary-parsingによるデコードも実験中
@StableNamesによる関数名安定化
- クロス言語RPCでは 関数名の安定性 が課題
- Swiftのデフォルトは関数名マングリングのため、Erlang側から呼び出し困難
- @StableNames マクロで、アクターのメソッドにユニークな安定名を付与可能
- 例:
@StableName("increment")
- 例:
- @Resolvable と組み合わせて、Erlang実装プロセスとも連携可能
- Protocolに@StableNames付与し、HasStableNamesに準拠
- 安定名を利用して、Swift/Erlang間で正確な関数呼び出しを実現
利用例と応用
- elixir_pack (ElixirアプリをiOS等にバンドル)の通信基盤として活用
- クライアント-サーバ間の分散Erlang通信や、メッセージフィルタリング用途
- Swiftの分散アクター×Erlang/Elixirの分散システム連携基盤
今後の展望
- クロス言語アクターシステムで 安定名 は必須要素
- Swift本体への @StableNames 的機能の統合を希望
- Swift分散アクターのさらなる発展とコミュニティの意見募集