Visual Studio 2015 RCが必須です。
ちょっとだけ雑感
Reliable Actors APIs と Reliable Services APIs のどちらかを選択する。
Actor の 並行性 がこんな感じ。
Hello, World サンプルコードがこんな感じ。先ほどの図の通り、だいぶ非同期満載です。
namespace HelloWorld { public class HelloWorld : Actor, IHelloWorld { public Task<string> SayHello(string greeting) { return Task.FromResult("You said: '" + greeting + "', I say: Hello Actors!"); } } }
ステートレスかステートフルかを選ぶ
まぁまぁ、シンプル。ServiceEventSource ってのよくわからないけど、キューみたいなのかな。
protected override async Task RunAsync(CancellationToken cancellationToken) { // TODO: Replace the following with your own logic. int iterations = 0; while (!cancellationToken.IsCancellationRequested) { ServiceEventSource.Current.ServiceMessage(this, "Working-{0}", iterations++); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } }
− ステートフルの場合
protected override async Task RunAsync(CancellationToken cancellationToken) { // TODO: Replace the following with your own logic. IReliableDictionary<string, long> myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary"); while (!cancellationToken.IsCancellationRequested) { using (ITransaction tx = this.StateManager.CreateTransaction()) { var result = await myDictionary.TryGetValueAsync(tx, "Counter-1"); ServiceEventSource.Current.ServiceMessage( this, "Current Counter Value: {0}", result.HasValue ? result.Value.ToString() : "Value does not exist."); await myDictionary.AddOrUpdateAsync(tx, "Counter-1", 0, (k, v) => ++v); await tx.CommitAsync(); } await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } }
IReliableDictionary という Reliable Collections が違うっぽい。ここにステートを保存する。
気になるステートの保存先はService Fabric の local disk? だけど、各ノードを横断的に保存するから信頼性が高いとか。
まとめ
見た感じ、かなり特殊なプログラミングモデルで、ASP.NET 等とはまた違う、新しいフレームワークと思って取り組まないとダメっぽい。しかしながら、パフォーマンスや信頼性については、机上の空論ではなく、Azure の各サービスで実績があるので、取り組む価値はあると考える。
サンプルコードが Azure/servicefabric-samples にあるので、詳しく追ってみたい。けれどもタイムオーバーなので、また今度。
追記
別なことしてたらふと思い出したので追記。
single-threaded actor model とかどっかで聞いたことあるなぁと思ったら、 Orleans にも同じ事書いてあった。 Orleans のことは 直接書かれていないけど、ベースになっていると考えて良いかなー。