📝

Orleansのチュートリアルをやってみた

2022/02/25に公開

.NET 7 Preview 1が発表されましたね。

https://devblogs.microsoft.com/dotnet/announcing-net-7-preview-1/

その中にOrleansに対する言及も含まれていました。

We’ll continue to make investments in Orleans, a .NET cross-platform framework for building distributed applications that has been referred to as “distributed .NET.” We’ll continue to enhance the comprehensive documentation for Orleans and make it easier to use and implement by improving integration of Orleans with existing cloud services like Azure App Services and Azure Container Apps.

雑に訳すと「お金かけていきまっせ!」って話なんですが、覚えている限り.NETレベルの発表の中に含まれていたのが過去にはなかったような気がするので、これからは第一線のフレームワークとして扱っていくのかなぁって印象がありました。

ASP.NET Core側の発表でも言及されてますね。

The ASP.NET Core and Orleans teams are investigating ways to further align and integrate the Orleans distributed programming model with ASP.NET Core. Orleans 4 will ship alongside .NET 7 and focuses on simplicity, maintainability, and performance, including human readable stream identities and a new optimized, version-tolerant serializer.

ということで、今後の波に乗り遅れないようにチュートリアルを触ってみました。

チュートリアルやってみた

ちなみにチュートリアルはここですね。

https://dotnet.github.io/orleans/docs/tutorials_and_samples/tutorial_1.html

ドキュメントではVS2017で、Orleansは2.2.0って書かれてましたが、普通にVS2022で.NET6のプロジェクト作って最新のOrleansのバージョンとってきたらコードを変えなくても動きました。

プロジェクト組んでコードを書き写してドキュメントに書かれているとおりSiloプロジェクトを最初に立ち上げてみます。立ち上がってきたコンソールに出力されているログを確認すると、どうやらポートが11111でサーバーが立ち上げるようですね。

info: Orleans.Runtime.Silo[100403]
      -------------- Initializing silo on host xxxxxxxxx MachineName xxxxxxxx at 127.0.0.1:11111, gen 383452391 --------------

ただ、もうちょっとログを追いかけると他のポートも使うみたいですね。

info: Orleans.Runtime.SiloOptionsLogger[0]
      Configuration Orleans.Configuration.EndpointOptions:
      AdvertisedIPAddress: 127.0.0.1
      SiloPort: 11111
      GatewayPort: 30000
      SiloListeningEndpoint:
      GatewayListeningEndpoint:

うん。ちょっとどれがどんな時に使われるかよくわかんないですね。ってことで一旦置いといてClientプロジェクトを立ち上げてみます。

ログの最初のほうにゲートウェイをポート30000に見つけたのでそこにつなぐねって出てますね。

info: Orleans.Messaging.GatewayManager[101309]
      Found 1 gateways: [gwy.tcp://127.0.0.1:30000/0]
info: Orleans.Networking[0]
      Establishing connection to endpoint S127.0.0.1:30000:0
info: Orleans.Networking[0]
      Connected to endpoint S127.0.0.1:30000:0
info: Orleans.Networking[0]
      Connection [Local: 127.0.0.1:54902, Remote: 127.0.0.1:30000, ConnectionId: 0HMFO0T4V47TN] established with S127.0.0.1:30000:0

ってことはSilo側でつかってるポート30000でつながるんでしょうけど、じゃポート11111は何ってのは謎のままです。他にはローカル側はポート54902だよって感じのもでてますね。

もうちょっとログを読み進めると、client GUID IDなんて値がありますね。この値でクライアント側を識別してそうです。

info: Orleans.OutsideRuntimeClient[100929]
      ---------- Started OutsideRuntimeClient with Global Client ID: Cxxx.xxx.xxx.xxx:0:-383452443*cli/32028cb1@edb31d8f, client GUID ID: *cli/32028cb1

ログの最後にはちゃんとプログラムから出してるメッセージがでてました。

Client said: 'Good morning, HelloGrain!', so HelloGrain says: Hello!

で、Silo側のログを見ると、メッセージを受け取ったときのログがでてますね。

SayHello message received: greeting = 'Good morning, HelloGrain!'

このログの上には上述していたポートやclient IDの値からの接続をオープンしたよってのも見受けられます。

info: Orleans.Runtime.Messaging.Gateway[101301]
      Recorded opened connection from endpoint 127.0.0.1:54902, client ID *cli/32028cb1.

感想

ここでのポイントはClient側でインターフェイスのメソッド呼んだら、Silo側で実装が動いてコンソールに文字が書き出されたよ!ってところでしょうか。分散した環境上で同じオブジェクトが動いているように見えますね。

ちょっと気になるのはGetGrainメソッドにIDを渡してインスタンスをとってきてるんですが、そのIDの情報ない場合はどういう風にするんでしょうね?実際のアプリケーションやと、指定されたIDでデータベース見て情報取ってきてなかったらNot Foundだよーって感じなのですが。このメソッドのカタチやとそんな判定入れられへんくて、問答無用にインスタンスが作られそうです。

面白そうなのですが、もうちょっと使いどころと使い方を調べないとですね。

ちなみに、最新のサンプルはこちら。

https://github.com/dotnet/orleans/tree/main/samples

その他

"Orleans"ってのをググるとバンドの情報が引っかかって「オーリアンズ」って読み方がでてくるんですが、動画とか見ると「オーリーンズ」って言ってるように聞こえます。どう読むんやろう。。。

https://docs.microsoft.com/en-us/shows/On-NET/Building-real-applications-with-Orleans

あれ、でもこっちやったら「オーリアンズ」って聞こえる。。

https://docs.microsoft.com/en-us/shows/Reactor/An-Introduction-to-Orleans

Discussion