読者です 読者をやめる 読者になる 読者になる

世界のやまさ

SEKAI NO YAMASA

Azure Service Fabric の SDK が公開されていた

Visual Studio 2015 RCが必須です。

ちょっとだけ雑感

Reliable Actors APIs と Reliable Services APIs のどちらかを選択する。

Actor の 並行性 がこんな感じ。

f:id:nnasaki:20150430141336p:plain

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 のことは 直接書かれていないけど、ベースになっていると考えて良いかなー。