Weitere ähnliche Inhalte
Ähnlich wie 始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~ (20)
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
- 3. 自己紹介
• 会社
株式会社ネクストスケープ
• 名前
上坂貴志(うえさかたかし)Twitter:@takashiuesaka
• 年齢
44歳
• 好き・興味あり
Azure(Microsoft MVP for Microsoft Azure)、
Scrum(認定スクラムマスター)
DDD、ソフトウェアアーキテクチャ、機械学習
• 講演活動
• 2016年
NS Study No.6 Azure IoTHub紹介
アプレッソ 最新IT事例セミナー Azure Machine Learning セミナー登壇
SANSAN DDD勉強会発表
• 2015年
FEST2015 (Channel9で動画公開)
MSxNextscape合同 Azure Machine Learningセミナー開催
Developers Summit 2015
QCon 2015
CloudDays2015東京・大阪 3
• 執筆活動
• 人工知能アプリケーション総覧 寄稿(日経BP社、2015年9月30日発売)
• ITPro:クラウドで機械学習を手近に、Azure Machine Learningの概要
www.nextscape.net 3
- 6. 会社紹介
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
エイベックス通信放送様( dTV powerd by BeeTV )
「dビデオ powered by BeeTV」は、スマートフォン利用者向けに映画、ドラマなどを視聴可能な国内最大
規模の動画配信サイトとして注目を集めている。
Microsoft Azureにて、高負荷・ハイパフォーマンスに耐えうるスケーラブルな配信インフラを構築。
http://special.nikkeibp.co.jp/as/201207/mpncompetency/cs01.html
400万会員を超える動画サイトの配信インフラを構築
EC売上を3年間で2倍以上にしたタワーレコードの成長を支えたCMS基盤を導入
- 30. ハードルを越えよう
www.nextscape.net 30
要件定義中からモデルを書きましょう
• モデリングをする、ということは業務フロー=モデル、となるはずです
• 逆にいうと、基本設計以降のフェーズだけでDDD採用は見送った方が良いです(負担ばかりが多くて価値が出にくい)
コンテキストマップを書きましょう
• これを軽視すると1つのコンテキストでモデリングしがちです。巨大なモデル群を作り上げてしまいます
最初からテーブル設計を絶対にしないこと
• DDDを採用すると開発プロセスが変わります。
• モデリングという作業が強要され、要件定義=モデリングしつつ実装も進めます
• ER図を作る=モデリングが完了を意味します。が、モデリングは要件定義なのでなかなか固まりません
• だからER図の作成は後回しにするしかないはずなのです
• RDBMSで保存するなら最終的にテーブル設計は必要ですが、最初からやろうとしてはいけません。無駄になるだけなら
いいですが、最悪モデリングしないで工程が進んでいきます。(もはやDDDではない)
私が感じた、実践したほうが良いプラクティス
大事!
- 33. Service Fabric SDKを使った実装
www.nextscape.net 33
ServiceFabricのSDKを使って実装すると
• 外部との通信が実現
• 中止、開始、停止時のイベントをハンドルできる
プログラミングモデルの種類
Reliable Service Reliable Actor
ステートレス Service ステートフル Service
Exe等の実行ファイル
単位のホスティング
Service Fabric
の基本
オブジェクト単位
のホスティング
データを保持しない
StatelessServiceクラス
を継承したクラスに実
装していく
データを保持する
StatefullServiceクラスを
継承したクラスに実装
していく
- 35. Service Fabricの外部と通信する
www.nextscape.net 35
StatelessService
RunASync, OnOpenASync, OnCloseASync, OnAbort
自作クラス
ICommunicationListener
自作のリスナークラス
OpenASyncメソッドの戻り値で返す文字列が重要。
外部からの着信をリッスンする場所を返却する
例:http://ホスト名:port/ほげほげ
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext =>
new 自作のリスナークラス())
};
}
Task<string> OpenAsync(CancellationToken cancellationToken)
Task CloseAsync(CancellationToken cancellationToken)
void Abort()
見ての通り、リスナーは複数返せるのでエン
ドポイントを複数用意できます。
1つはhttpで、もう1つもhttpでPort違い、3つ
目はtcpでクラスタ内通信とかできます
あれ?こっちも
Open,Close,Abo
rtじゃないか
- 36. Webで通信
IISが動かないので、OWINで自己ホストします
Visual Studioに用意されるテンプレートのService Fabric
WebAPIはMSDNで解説している内容の完全実装です
www.nextscape.net 36
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
- 38. WCFで通信
www.nextscape.net 38
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()
))
};
}
- 39. WCFで通信
www.nextscape.net 39
サンプルで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
設定を記載します