ns study8 ddd microservices azuer service fabric
TRANSCRIPT
![Page 1: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/1.jpg)
2016/07/06株式会社ネクストスケープエバンジェリスト 上坂貴志
NSStudy No.8
www.nextscape.net 1
~ C# と Azure Service Fabric で最高の DDD 開発を~
ドメイン駆動設計& Azure で行うマイクロサービス開発
![Page 2: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/2.jpg)
www.nextscape.net
アジェンダなぜ今 Microservices なのかMicroservices と DDDDomain-Driven DesignDDD 導入のハードルAzure Service Fabric最後に
2
![Page 3: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/3.jpg)
自己紹介• 会社
株式会社ネクストスケープ
• 名前上坂貴志(うえさかたかし) Twitter:@takashiuesaka
• 年齢44 歳
• 好き・興味ありAzure(Microsoft MVP for Microsoft Azure) 、Scrum (認定スクラムマスター)DDD 、ソフトウェアアーキテクチャ、機械学習
• 講演活動• 2016 年
de:code 2016 DDD & Azure Service Fabric 登壇NS Study No.6 Azure IoTHub 紹介 アプレッソ 最新 IT 事例セミナー Azure Machine Learning セミナー登壇SANSAN DDD 勉強会発表
• 2015 年FEST2015 (Channel9 で動画公開 )MSxNextscape 合同 Azure Machine Learning セミナー開催Developers Summit 2015QCon 2015CloudDays2015 東京・大阪 3
• 執筆活動• 人工知能アプリケーション総覧 寄稿(日経 BP 社、 2015 年 9 月 30 日発売)• ITPro :クラウドで機械学習を手近に、 Azure Machine Learning の概要
www.nextscape.net 3
![Page 4: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/4.jpg)
会社紹介
www.nextscape.net 4
設立年月日 2002 年 4 月 10 日 資本金 1 億 5001 万円 主要株主 株式会社豆蔵ホールディングス (東証一部上場)
〒 163-0722東京都新宿区西新宿 2-7-1小田急第一生命ビル 22F03-5325-1301( 代表 )
![Page 5: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/5.jpg)
会社紹介
www.nextscape.net 5
クラウド、デジタルマーケティング、システム構築に強み
(※ 2012 年~ 2014 年マイクロソフト パートナーズ オブ ザ イヤー)
2013 Microsoft Worldwide Partner Award において
Sitecore Of The Year Asia 2013 において
Cloud Partner of the Year ファイナリスト選出
Best Japanese Site を受賞
3 年連続 Microsoft Azure パートナー アワード受賞
![Page 6: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/6.jpg)
会社紹介
www.nextscape.net 6
タワーレコード様
「 NO MUSIC, NO LIFE. 」のキャッチフレーズでおなじみの、音楽エンタメ・小売り事業の大手。250 万点もの商品を取り扱うオンラインショップ「 TOWER RECORDS ONLINE 」の CMS を Sitecoreで構築。2010 年当時に 1 日当たり 100 万強だった PV は、 2014 年 4 月時点で 205 万強まで倍増。https://www.sitecore.net/ja-jp/customers/e-commerce/towerrecords.aspx
エイベックス通信放送様( d TV powerd by BeeTV )
「 d ビデオ powered by BeeTV 」は、スマートフォン利用者向けに映画、ドラマなどを視聴可能な国内最大規模の動画配信サイトとして注目を集めている。Microsoft Azure にて、高負荷・ハイパフォーマンスに耐えうるスケーラブルな配信インフラを構築。http://special.nikkeibp.co.jp/as/201207/mpncompetency/cs01.html
400 万会員を超える動画サイトの配信インフラを構築
EC 売上を 3 年間で 2 倍以上にしたタワーレコードの成長を支えた CMS 基盤を導入
![Page 7: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/7.jpg)
なぜ今Microservices なのか
![Page 8: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/8.jpg)
なぜ今 Microservices なのか
www.nextscape.net 8
サービス切り出し指針がなかったサービス間の連携について標準がなかった
可用性を担保が難しかった分散リソース実装が辛すぎた
初期 SOA の思想は素晴らしかっただが思想を実現する前に SOA の概念が拡大しすぎた
設計
設計・実装
インフラ
実装
初期 SOA の思想の実現ですら難しかった
![Page 9: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/9.jpg)
Microservices と DDD
![Page 10: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/10.jpg)
Microservices と DDD
www.nextscape.net 10
よく見かけるのが
というやり取り。
サービスをどうやって分割すればいい?DDD の「境界付けられたコンテキスト」が参考になります
折角 DDD に触れるのにそこだけ?勿体無い!
![Page 11: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/11.jpg)
Domain-Driven Design
![Page 12: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/12.jpg)
DDD の考える課題
www.nextscape.net 12
戦略 要件 基本設計 詳細設計 実装
変換 変換 変換 変換
この戦略はどの実装?この実装はどの戦略?
この変換が全ての元凶!
![Page 13: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/13.jpg)
DDD の考える課題
www.nextscape.net 13
顧客にとっては理不尽だらけの IT 業界機能追加して機能の改善してバグだ!すぐ修正して
工数とスケジュールの提示するけど・・・
でも工数の根拠は提示されない。提示できない。
![Page 14: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/14.jpg)
DDD の考える課題小さな機能追加依頼• 以前と同じぐらいのボリュームだろう、と顧客は思っている
見積もり提示• 以前に比べて高額• でも根拠は提示されない(できない)
不信感• 高い!遅い!前と違う!• もっと早く、もっと安くできるでしょ?
スケジュール優先の対応•顧客の要望は品質よりスケジュール、予算よりスケジュール、と理解•ソースが肥大化(品質悪化)
www.nextscape.net 14
不信感の負の連鎖
![Page 15: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/15.jpg)
DDD の目指す世界業務をモデルで表す
モデルをそのまま実装するモデルから業務を改善する
www.nextscape.net 15
業務と実装のギャップを埋める
余談:業務=ドメインってこと?詳しくは後ほど
![Page 16: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/16.jpg)
DDD のよくある誤解
そういう箇所も一部もありますが、それは DDD のメインではありません。ビジネスモデリングなどの要求開発工程から業務フローなどの要件定義工程などを含んでいます。
www.nextscape.net 16
DDD とはデザインパターンのような設計技法である
![Page 17: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/17.jpg)
モデリングから実装へのプロセス
ドメインをコンテキストで分割コンテキストごとにドメインをモデルとして表現する
モデルをそのまま実装する
www.nextscape.net 17
最初はものすごくざっくりとした理解から
![Page 18: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/18.jpg)
そもそもドメインとは何か もっとざっくりと具体的には、ドメインとは
www.nextscape.net 18
システムを使う人にとっての関心事のことです。
DDD ではドメインエキスパート、という言葉出てきます。これは業務(ビジネス)に精通している人のことを指します。
業務 業務の成果という感じで最初はいいんじゃないでしょうか
達成したいことエンドユーザー運用者
※異論は認めます!他にもステークホルダーはいっぱいいますよね
が
![Page 19: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/19.jpg)
ではコンテキストとは何か誤解を恐れずに言えば、「環境」
特定のモデル達だけが意味を持つ「環境」モデルが特定の意味を持つための「前提条件」
www.nextscape.net 19
そのモデルは、そのコンテキストだけでしか成立しない
もうちょっと言えば もっと正確に言うと
![Page 20: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/20.jpg)
ではコンテキストとは何か
www.nextscape.net20
メンバー同士の会話 特定の作業 あるコードの範囲
そのモデルは、そのコンテキストだけでしか成立しないコンテキストの例
例:料金というモデル。ある時は送料を、ある時は発注代金を表す例:コンテンツを個人単位にブックマークする機能のことを、ある時はお気に入り機能、ある時はクリップボード機能
よくある混乱 違うものを同じ言葉で表す 同じものを違う言葉で表す
![Page 21: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/21.jpg)
境界付けられたコンテキストとは
業務別• 在庫管理業務• 商品発送業務
顧客の組織別• パッケージング・発送• 経理• 経営• 広告
他システム• DDD 本の例だとレガシーシステムが良く出てくる
www.nextscape.net 21
つまり粗い前提条件別にアプリを分割することよくある分割指針
コンテキスト(前提条件)が違うことが明確になった結果のこと
![Page 22: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/22.jpg)
分割したコンテキストを明示化
www.nextscape.net 22
順応者
図の参考:コンテキストマッピングによる戦略的ドメイン駆動設計https://www.infoq.com/jp/articles/ddd-contextmapping_jp
コンテキストマップ 目的1.コンテキスト間の関係を明示化
コンテキスト間の情報の伝達には注意が必要他コンテキストのモデルで自分のモデルを侵食されないようにする腐敗防止層 (Anti Corruption Layer) の検討を
情報変更のトリガーとしてドメインイベントの検討を
Webユーザープロファイル
個人財務管理銀行システム
支払い追跡
オンライン銀行サービス(レガシーシステム )
腐敗防止層
パートナー
U
D D
U
![Page 23: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/23.jpg)
分割したコンテキストを明示化
www.nextscape.net 23
目的2.コンテキスト間のモデルのマッピング
図の参考: Modularity and Domain Driven Design; a killer combination?http://www.slideshare.net/aca_it/modularity-ddd
コンテキストマップ
車
オプション オーナー
保証
モデル
製造
車コンテキスト
輸送
場所輸送対象
輸送先顧客 輸送依頼元
輸送コンテキスト
ビジネスパートナー担当窓口 住所ビジネスパートナーコンテキスト
from
to
![Page 24: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/24.jpg)
不信感の負の連鎖を断ち切るwww.nextscape.net 24
![Page 25: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/25.jpg)
モデルを顧客と作るモデルを顧客と作る=要件定義+設計です
www.nextscape.net 25
• モデルで使用されている名詞や動詞に、顧客が知らない言葉があってはならない。• モデルがそのままコードになる=言葉がコードで使用される
顧客と同じ言葉でモデリングする。
業務の中身をモデリング• 顧客と一緒にモデリングすることが重要
開発者もモデリングに参加する意義• 業務を正確に把握できる
顧客もモデリングに参加する意義•複雑な業務がそのままコードになることからコスト感覚を持てる
重要なプラクティス、ユビキタス言語
![Page 26: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/26.jpg)
おまけの話DDD のソフトウェアアーキテクチャ達成すべきこと
• ドメインレイヤー内でドメインモデル以外の余計なものを絶対に入れない• DDD 本ではレイヤーアーキテクチャが掲載されているが、特にこの構成を採用せよと規定されていない
www.nextscape.net 26
図の参考: DDD and Hexagonal architecturehttp://tindaloscode.blogspot.jp/2013/11/ddd-and-hexagonal-architecture.html
「実践ドメイン駆動設計」ではPortAndAdapter (別名ヘキサゴナルアーキテクチャ)をお勧めしている
余計なものって?例えばデータ永続化ロジック トランザクション 権限チェックロジック
ドメインLayer
Appl
icat
ion
Laye
r
Port
内部 Client Port
外部 Client Port
内部永続化 Port
外部サービス Port
HTMLWeb Gadget
RIAViewer
Web API
ESBinbound
RDBMS
In-memoryObject store
他システムESB
outbound
プレゼンLayer
インフラLayer
![Page 27: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/27.jpg)
DDD 導入のハードル
![Page 28: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/28.jpg)
DDD がなかなか採用されない理由DDD 本が難解すぎる
• とにかく分厚い• 前提とするスキルレベルがかなり高い( PoEAA知ってるとか)• 章立てとプロセスが紐づいていないので混乱しやすい
設計・実装のイメージが沸かない• 結局どうすればいいのかわからない• どこから手を付ければいいのかわからない
モデリングできる人がいない• 大抵の場合、 ER図になる• もしくは、ただ構造を表しただけの静的なモデルとなる
www.nextscape.net 28
小さななシステムには向かない手法小さく実験しても効果がわからない
むしろ煩雑なだけにしか感じない何がいいのかわからない
最大のハードル:試しにくい
![Page 29: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/29.jpg)
ハードルを越えよう「実践ドメイン駆動設計」は読みやすいです• 本で登場するサンプルの著者による実装が Github にあります• https://github.com/VaughnVernon/IDDD_Samples
まずは社内システムから• そこそこ複雑なものを選ぶ• システム開発にあまり詳しくなく、モデリングに付き合ってくれる業務担当者に協力を依頼
www.nextscape.net 29
![Page 30: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/30.jpg)
ハードルを越えよう
www.nextscape.net 30
要件定義中からモデルを書きましょう• モデリングをする、ということは業務フロー=モデル、となるはずです• 逆にいうと、基本設計以降のフェーズだけで DDD採用は見送った方が良いです(負担ばかりが多くて価値が出にくい)
コンテキストマップを書きましょう• これを軽視すると1つのコンテキストでモデリングしがちです。巨大なモデル群を作り上げてしまいます
最初からテーブル設計を絶対にしないこと• DDD を採用すると開発プロセスが変わります。• モデリングという作業が強要され、要件定義=モデリングしつつ実装も進めます。• ER図の作成開始はモデリングが完了してからです。が、モデリングは要件定義なのでなかなか固まりません。• だから ER図の作成は後回しにするしかないはずなのです。• RDBMS で保存するなら最終的にテーブル設計は必要ですが、最初からやろうとしてはいけません。無駄になるだけならいいですが、最悪モデリングしないで工程が進んでいきます。(もはや DDD ではない)
私が感じた、実践したほうが良いプラクティス
大事!
![Page 31: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/31.jpg)
Azure Service Fabric難解極まる MSDN を読み解こう!
![Page 32: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/32.jpg)
Azure Service Fabric とは
www.nextscape.net 32
スタンドアロンアプリのクラスタ化 PaaS です。• クラスタリングとは?多数の低廉なコンピュータを、特別なソフトウェア・ハードウェアを用いて、あたかも 1 つの大きなコンピュータとして利用できるように接続すること。( Wikipedia )
1. 負荷分散・・・複数のマシンで処理を分散• クラスタの特徴とは?
2. 高可用性・・・ 1台のマシンが停止しても、待機系マシンがすぐ立ち上がる
![Page 33: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/33.jpg)
イメージ
www.nextscape.net 33
Exe
Exe
Exe
Exe
Exe
Exe
Exe Exe処理リクエスト
• 5つの Exe で負荷分散• 3つの Exe が待機中
![Page 34: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/34.jpg)
イメージ
www.nextscape.net 34
Exe
Exe
Exe
Exe
Exe
Exe
Exe Exe処理リクエスト
• 5つの Exe で負荷分散• 3つの Exe が待機中
Exe1つが停止してしまった
![Page 35: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/35.jpg)
イメージ
www.nextscape.net 35
Exe
Exe
Exe
Exe
Exe
Exe
Exe Exe処理リクエスト
• 5つの Exe で負荷分散• 3つの Exe が待機中
Exe1つが停止してしまった
待機系が昇格
![Page 36: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/36.jpg)
イメージ
www.nextscape.net 36
Exe
Exe
Exe
Exe
Exe
Exe
Exe Exe処理リクエスト
• 5つの Exe で負荷分散• 3つの Exe が待機中
再起動して待機系に
待機系が昇格
![Page 37: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/37.jpg)
Azure Service Fabric とは
www.nextscape.net 37
スタンドアロンアプリは 2種類に大別されます。1. Exe, Java アプリなどのスタンドアロンアプリをホスティング 2. ServiceFabric の SDK を使ったアプリをホスティング(実はこれもスタンドアロン
ゲスト実行可能ファイル ステートレスサービス ステートフルサービスという名称です。でも ServiceFabric は として起動します。 2種類のタイプのサービスを作ることができます。ステートレスサービス
![Page 38: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/38.jpg)
Azure Service Fabric とはMSDN を見るともう 1 つ Reliable Actor というものがあります。これは Exe単位ではなくオブジェクト単位のクラスタです。
www.nextscape.net 38
実態は ステートフルサービス です。つまり、 Service Fabric を理解する近道は
ステートレスサービス ステートフルサービスを理解することです。
※もっと言うと、ステートレスサービスから理解するとわかりやすいです。ちなみに Service Fabric はオンプレでも Linux でも動きます!別に Azure 上だけで動くサービスじゃありません!
![Page 39: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/39.jpg)
Azure Service Fabric でマイクロサービスとは
www.nextscape.net 39
大きなシステム
小さなサービス 小さなサービス
小さなサービス
分割
小さなサービス
独立した小さなサービスが協調して大きなシステムを構成
モノリス マイクロサービス
![Page 40: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/40.jpg)
Azure Service Fabric でマイクロサービスとは
www.nextscape.net 40
ステートレス、ステートレス、時にはAcitor も組み合わせて大きなシステムを構成します。
大きなシステム 分割
モノリス Service Fabric
ステートフルサービス ステートフルサービス
Microsoft Azure
ステートレスサービスステートレスサービス
これ1つずつについて・負荷分散・高可用性を担保することができる
![Page 41: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/41.jpg)
Service Fabric SDk
www.nextscape.net 41
![Page 42: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/42.jpg)
Service Fabric SDK を使った実装
www.nextscape.net 43
ServiceFabric の SDK を使って実装すると• 外部との通信が実現• 中止、開始、停止時のイベントをハンドルできる
プログラミングモデルの種類
Reliable Service Reliable Actor
ステートレス Service ステートフル Service
Exe等の実行ファイル単位のホスティング
Service Fabricの基本
オブジェクト単位のホスティング データを保持しない StatelessService クラスを継承したクラスに実装していく
データを保持する StatefullService クラスを継承したクラスに実装していく
![Page 43: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/43.jpg)
StatelessServiceから覚えましょう。
www.nextscape.net 44
![Page 44: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/44.jpg)
Stateless Service の仮想メソッド達
www.nextscape.net 45
StatelessService
※StatefullService も同名の仮想メソッドを持っていて使い方も同じですが、クラス階層を辿っても、 StatelessService と StatefullService は関連がありません
自作クラスTask RunAsync( CancellationToken cancellationToken)
Task OnOpenAsync( CancellationToken cancellationToken)
Task OnCloseAsync( CancellationToken cancellationToken)
void OnAbort()
IEnumerable<ServiceInstanceListener>
CreateServiceInstanceListeners()
サービス起動イベントハンドラバッチ処理用サービス起動準備の最後にレイズするイベントのハンドラ。初期化処理用サービス停止イベントハンドラ
外部からの着信を待ち受けるリスナーを返却する
サービス中止イベントハンドラ
※全部仮想メソッドなので必要なメソッドだけ Override する 上の4つのメソッドはイベントハンドラ
![Page 45: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/45.jpg)
Service Fabric の外部と通信する
www.nextscape.net 46
StatelessService
RunASync, OnOpenASync, OnCloseASync, OnAbort
MyService
ICommunicationListener
MyListener
protected override IEnumerable<ServiceInstanceListener>
CreateServiceInstanceListeners(){ return new ServiceInstanceListener[] { new ServiceInstanceListener(serviceContext => new MyListener ()) };}
Task<string> OpenAsync( CancellationToken cancellationToken)
Task CloseAsync( CancellationToken cancellationToken)
void Abort()
見ての通り、リスナーは複数返せるのでエンドポイントを複数用意できます。1 つは http で、もう 1 つも httpで Port 違い、 3 つ目は tcp でクラスタ内通信とかできます
あれ?こっちもOpen,Close,Abor
t じゃないか OpenASync メソッドの戻り値で返す文字列が重要。外部からの着信をリッスンする場所を返却する例: http://ホスト名 :port/ ほげほげ
![Page 46: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/46.jpg)
Web で通信 IIS が動かないので、 OWIN で自己ホストします Visual Studio に用意されるテンプレートの Service Fabric WebAPI は MSDNで解説している内容の完全実装です
www.nextscape.net 47
StatelessService
自作クラス
Startup
void ConfigureApp(IAppBuilder appBuilder)
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners(){ return new ServiceInstanceListener[] { new ServiceInstanceListener( serviceContext => new OwinCommunicationListener( Startup.ConfigureApp, serviceContext, ServiceEventSource.Current, "ServiceEndpoint")) };}
ICommunicationListener
OwinCommunicationListener
Task<string> OpenAsync(CancellationToken cancellationToken)
OpenASync でリッスンする URI を組み立てて、サーバースタートしているだけ
https://azure.microsoft.com/ja-jp/documentation/articles/service-fabric-reliable-services-communication-webapi/
MSDN 解説の URL
![Page 47: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/47.jpg)
WCF で通信
www.nextscape.net 48
なんと。 ICommunicationListener を実装済みのクラスが提供されています。Nuget で入れます
完全なサンプルが見当たらないので、実装のポイントをいくつかhttps://azure.microsoft.com/ja-jp/documentation/articles/service-fabric-reliable-services-communication-wcf/
MSDN 解説の URL
プロジェクト構成
※サンプルではクライアントも同じクラスタ内で稼働させる必要があるため、クライアントを StatelessService でプロジェクト追加します
プロジェクト参照します
![Page 48: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/48.jpg)
WCF で通信
www.nextscape.net 49
WCFホスト側の実装Calculator の実装がサンプルに見当たりません。適当に作ってくださいclass Calculator : ICalculator{ public Task<int> Add(int value1, int value2) { return Task.FromResult(value1 + value2); }}
<Resources> <Endpoints> <Endpoint Name="WcfServiceEndpoint" Protocol="tcp" Port="8515"/> </Endpoints> </Resources>
リッスンする場所とプロトコルを定義して名前つけます
internal sealed class WcfHostStateless : StatelessService{ private ICalculator _calculator; public WcfHostStateless(StatelessServiceContext context) : base(context) { this._calculator = new Calculator(); }
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners(){ return new ServiceInstanceListener[] { new ServiceInstanceListener(serviceContext => new WcfCommunicationListener<ICalculator>( wcfServiceObject:this._calculator, serviceContext:base.Context, endpointResourceName: "WcfServiceEndpoint", listenerBinding: WcfUtility.CreateTcpListenerBinding() )) };}
![Page 49: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/49.jpg)
WCF で通信
www.nextscape.net 50
サンプルで ServiceUri というオブジェクトが説明なく出てきます。これは WCF を実装したホストの場所を保持した Uriオブジェクトです。例:” fabric:/ アプリ名 / サービス名 /”
WCF クライアント側の実装クライアント側にもライブラリをいれてください
private void CallWcf(StatelessServiceContext context, string endpointName){ var binding = WcfUtility.CreateTcpClientBinding();
IServicePartitionResolver partitionResolver = ServicePartitionResolver.GetDefault();
var wcfClientFactory = new WcfCommunicationClientFactory<ICalculator> (clientBinding: binding, servicePartitionResolver: partitionResolver);
var calculatorServiceCommunicationClient = new WcfCommunicationClient( wcfClientFactory, new Uri("fabric:/ServiceFabricWcf/WcfHostStateless"), ServicePartitionKey.Singleton);
var result = calculatorServiceCommunicationClient.InvokeWithRetryAsync( client => client.Channel.Add(2, 3)).Result;}サンプルそのままです
this.CallWcf(this.Context, "WcfServiceEndpoint");
RunAsync の中で CallWcf メソッドを呼びますWcfホストと同じ
Endpoint 設定を記載します
![Page 50: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/50.jpg)
最後に
![Page 51: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/51.jpg)
で一緒に働きませんか!一次請け案件 100%SES やっていません。すべて自社開発(西新宿)
www.nextscape.net 52
DDD プロジェクト2つ進行中 Scrum プロジェクト 3 つ進行中
裁量労働制 コーヒー、ミネラルウォーター、お茶飲み放題デュアルディスプレイ支給 技術書籍は全額会社負担 各種社外研修も全額会社負担 海外カンファレンスも積極的に行けます
募集中!• PM• PL• SE• スマホエンジニア
![Page 52: NS study8 DDD Microservices Azuer Service Fabric](https://reader036.vdocuments.site/reader036/viewer/2022062223/58b879851a28ab44078b4715/html5/thumbnails/52.jpg)
イラストはこちらを利用させていただきましたいらすとや: http://www.irasutoya.com/
www.nextscape.net 53
ブースにも来てね! NS Studyで待ってます!