まとめ
Azure Service Fabric のセッションを聞きました。アーキテクチャーは相当素晴らしいと思いますが、いかんせん WCF っぽかったり、この実装がスタンダードになるにはちょっと難しいかなという感じはしました。
スライドを見たコメントをつけていますが、私の英語力の限界もあり、そうとう間違った解釈もしていると思いますのでご容赦ください。
このボリュームは落ち穂拾いどころじゃないので、別にまとめるべきだったなぁ。。。
セッション感想
Microsoft Azure Service Fabric Architecture (Channel 9)channel9.msdn.com



マイクロサービスのステートレスとステートフル

ステートレスのデモ

うーん。ここまで見てきたけど、イマイチピンと来ないのと英語がよく聞き取れないのでここまで。
Building Resilient, Scalable Services with Microsoft Azure Service Fabric (Channel 9)channel9.msdn.com

前半は同じような話なので飛ばす。

デモの英語がインド系だけどコードがまだ何とかわかるので、こっちを見てみる
Actor を使ったデモ。 インクリメンタルするカウンターがプリミティブなフィールド。

こんな感じで無限ループでカウントアップさせていくよう

実行するとカウントアップする

ノードをリスタートすると。。。

カウンターがリセットされる

ではどうすればステートが保持されるか? シリアライザブルなクラスを追加し、Actorのジェネリクスに追加する

this.value ではなく、 this.State.value の値を使う。Actor が持っているっぽい。

デプロイしてブレイクポイントにも止まります。

先ほどのノードが1つだったのが3つに増えている。プライマリーとセカンダリーが2つ。特に設定はしておらず、自動的になった。

先ほどと同じように Node4 にリスタートをかけるとプライマリーノードがダウン。即セカンダリーにフェールオーバー。また、Node4 がセカンダリノードとして復活。



カウンターが途切れること無く続行(拍手) 。フェールオーバーまで3秒もかかっておらず、素晴らしい。

oh… Deep Dive …

Deep Dive into Microsoft Azure Service Fabric Reliable Actors (Channel 9)channel9.msdn.com
DeepDive をチラ見した感じだと、 Actor の歴史とかどうして使うかが説明されてて、もやもやがちょっと紐解けそうな感じがしました。


ここでやめようかと思ったけど、もうちょっとだけがんばって、次はアプリケーションのデプロイの話。
Code と Config をサービスごとにパッケージングする


各サービスをアプリケーションパッケージにまとめる。アプリケーションタイプにはサービスタイプとWebアプリケーションタイプに分かれる

サービスタイプ、アプリケーションタイプと分かれる。それぞれユニークな名前を持つようだけど、ちょっと理解出来ず。

サービス API は ステートレスかステートフルで選べる。

Reliable Collections 最強の図。複数のマシンでレプリケート可能で永続化可能で非同期でトランザクション制御もできる。

IReliableDictionary<K, V> のハッシュと、 IReliableQueue のキューの2種類がある。

コード例。 [ServiceContract]って めっちゃWCF臭がする。。。

てか、Namespace にめっちゃ WCF ってかいてるじゃん。。。

Actor と同じように、ステートレスのデモ。サービスをリスタートさせるとカウントが戻る



従来の Could Service と Stateful Service Fabric で作る場合の対比図。Service Fabric で作れば、 Reliable Collections で済んでしまうので、 Azure Queue も Table も不要になる。 従来のクラウドデザインパターンを覆すぐらいのインパクトありますね。

次はステートフルの例。やはり3パーティションできる。Actor と同じようにリスタートをかけても、大丈夫。Actor の時よりサービスが重いためか、なかなか Down から上がってこないが、残り二つのパーティションで頑張っている。


スケールアップの話。パーティションを増やすことでスケールアップできる。 RAID5とかと同じイメージ。 Node には複数のパーティションがあり、パーティションは必ず3つのレプリカを各 Node に作成する。

ロードバランサーでリクエストを受けて、各パーティションにリクエストを振り分ける。ところでこのパーティションを分割するとデータは垂直分割なんだろうか水平分割なんだろうか。

パーティション増やすのも ApplicationManifest.xml に書けば良いだけかな?

さっきよりグラフィカルな監視画面。例えばノード単位で落としても、フェールオーバーしてアプリケーションは継続して動く。

Chaos Test Service。ランダムでノードとパーティションを落として、耐久テストを行う。

ランダムで落としてもゾンビのように立ち上がってくるパーティション達。カウントはその間止まること無く増え続ける(拍手)

質疑応答も大人気。その間も止まること無くテストは続く。

次のセッションの準備中まで質問は続くよ。質問ではクラウドサービスからの移行はどうかとか、デプロイはどうかとか言ってました。移行はドキュメントを用意するのと、デプロイはリソースマネージャーで出来るよと言ってた気がする。
なるほど、この規模のデプロイは単純にいかないから、リソースマネージャーが結構フューチャーされていたのかなぁと感じがしました。
