第3回Reactive System Meetup in 西新宿 でのLT発表資料です。 http://reactive-shinjuku.connpass.com/event/38411/
なお、10分にはおさまらなかった模様... 補足記事:http://yoskhdia.hatenablog.com/entry/2016/09/29/214318
υϝΠϯΠϕϯτΛઃܭ͢ΔReactive Messaging Patterns͓ΑͼImplementing Domain−Driven DesignΑΓ2016/09/29@yoskhdiaୈ3ճReactive System Meetup in ৽॓ϋογϡλάɿ#reactive_shinjukuNJO
View Slide
About me• ԞాՂڗʢYoshitaka Okudaʣ• גࣜձࣾSocketʢKDDI Syn.ϗʔϧσΟϯάεάϧʔϓʣ ΞʔΩςΫτ• Twitterɹɹ @yoskhdia• interested in DDD & Reactive System & TeamBuilding & more !
Agenda• メッセージの種類• ドメインイベントの設計※メッセージ駆動の手段は色々あると思いますが、 書籍「Reactive Messaging Patterns with the Actor Model」 をベースに進めます。※DDD(Domain-Driven Design)成分強めです。
ϝοηʔδͷछྨʢେ·͔ʣ• Command Message• Point-to-Pointで送るのが基本。Commandはそれ自体がActorの振る舞いを表現する。Receiverが正しく振る舞えるようにデータなどを内包する。(結果を返して欲しい場合Query)• Document Message• 情報を伝達するために使う。ただし、そのデータをどう使うかは指し示さない。Commandを送ってきたSenderへの返答として使用される。(Request-Reply)• Event Message• Pub/Subを使うなど、不特定多数にブロードキャストする。(Commandによって)起きた出来事として使用される。
DocumentͱEventͷҧ͍4FOEFS 3FDFJWFS4FOEFS 3FDFJWFS தܧDocument MessageEvent Message違いは内容とタイミングの重視具合。Documentは内容が重要で多少遅れても確実に届けたいもの。(Guaranteed Deliveryなど)Eventはタイミングが重要で発生したらすぐに発行するもの。
υϝΠϯΠϕϯτͷઃܭ
υϝΠϯΠϕϯτͱ• ドメインエキスパートが気にかける、何かの出来事(IDDD p.274)• DDD本執筆時はドラフトだったため未収録• DDD Referenceでは収録されている• 実装する手段としてEvent Message• 逆に言えばドメインイベントを学ぶと良いEvent Message設計のヒントになる
υϝΠϯΠϕϯτͷݟ͚ͭํ• 別の集約の状態に依存している集約を見つけるのが簡単• 「〜するときに、」• 「もしそうなったら、〜」• 「〜の場合は、私に知らせて欲しい」「〜の場合は、通知して欲しい」• 「〜が発生したときに、」• すべてがドメインイベントになるわけではないけれど、これらのフレーズには注意を向ける必要がある。
υϝΠϯΠϕϯτͷઃܭ• 名前やプロパティは、イベント発生元の境界づけられたコンテキストのユビキタス言語に沿ったものにする。• その出来事が過去に発生したことがわかるような名前にする(発生した事実を名前に!)• 集約上で何らかのコマンドを実行した結果として発生するイベントの場合は、実行したコマンドにもとづくイベント名を使うことが多い。• ヒント:イミュータブルデータモデル(入門編)
ઃܭͷҙ• イベントはイミュータブルにする• 何が発生したのかをきちんと表すようにプロパティを持たせる• 通常は、発生要因の情報(集約の識別子など)を持たせる。• Receiverがイベントの発行元の集約に追加の問い合わせをすることは避けるべき。複雑化を招き、処理コストも増大して、メッセージである必要性が薄れる。Receiverが発生要因以外にも情報を必要とするなら、イベントに新たな情報と振る舞いを追加することはある。• 他方のアプリケーションが、オブジェクト全体のコピーを持つことはまずない。そのため、購読側がそのイベントに対応できる必要最小限の情報だけを含めるようにする。(それがどうしてもできないときは、RPCを使わざるを得なくなることもある。)
ΠϕϯτΛूͱͯ͠ѻ͏• 集約から発行される以外にも、ユーザのアクションによって、クライントから直接イベントが作られる設計をすることもある。• この場合、イベントを集約としてモデリングし、リポジトリに保持させることができる。イベントは過去の出来事を表すものなので、リポジトリは集約の変更・削除を許可しない。• イベントをこの方式でモデリングする場合は、集約と同様、イベントもモデルの構造の一部となる。したがって、このイベントは単なる過去の出来事の記録ではなくなる。(IDDD p.282)• エンティティと同様に一意な識別子を割り当てても良い。(様々な変更が加わってもイベントの一意性が守られるので好ましい。特に外部へ送信するような場合。)
υϝΠϯΠϕϯτͰͳ͘ୈҰڃͷυϝΠϯΦϒδΣΫτʹͳΓಘΔ
ϛϡʔλϒϧͳͷͱΠϛϡʔλϒϧͳͷΛ͚ΒΕΔ
Πϛϡʔλϒϧͳͷߋ৽͕ແ͍ͷͰϞσϧͷෳࡶੑΛݮͤ͞Δ
ϛϡʔλϒϧͳྖҬΛڱΊͯϞσϧͷෳࡶੑΛݮͤ͞Δ
ӬଓԽͷҙ• リポジトリに格納すると同時に、メッセージング基盤を使って発行することができる。クライアント→ドメインサービス→イベント作成→リポジトリへ追加→メッセージング基盤• メッセージングを利用する場合、ドメインモデルが利用する永続化ストアと、メッセージング基盤が使う永続化ストアの整合性は保たなければならない。例えば以下の選択肢。• 同一のローカルトランザクションを利用する。• グローバルなXAトランザクション(二相コミット)で制御する。• イベント用の特別なストレージをドメインモデルが使っているのと同じデータストア内に用意する。
খʁ·ͱΊ• MessagingのひとつにEvent Messageがある• 良いEvent Message設計のヒントにDDDのドメインイベントが使える• ミュータブルな領域を狭め、イミュータブルな領域と住み分けることで、複雑性が低減し変化に適応しやすくなる• EventSourcing程いかなくても、ドメインイベントをモデリングすることは非常に有用
ͱ͍͑ɺ࣮໘Ͱࢁͷߟྀࣄ߲͕͋Δ
Reactive Messaging Patterns with the Actor Modelʴ
ࢁͷ༗༻ͳύλʔϯ͕ʂ• Correlation Identifier• Message Sequence• Message Expiration• Format Indicator• Canonical Data Model• etc etc etc...
ワシのパターンは百八式まであるぞ・・・※そんなにはありません
ͻͱΓͰಡΊΔ͔ͳɾɾɾ
こんなところに読書会が!奇遇ですね!※宣伝です
࣮ફ͢Δͷෆ͕҆Ұഋɾɾɾ
こんなところにコンサルティングサービスが!奇遇ですね!※オチにしてごめんなさい
·ͱΊ• 書籍「Enterprise Integration Patterns」にはエンタープライズ領域でのシステム構築で使えるヒントがいっぱい。• 書籍「Reactive Messaging Patterns」はEIPをベースにして、Actor Modelへの適応を考察している。• Akkaの登場によってEIPの実践が(より)現実のものになった。• Messagingはモデリングにも有用
ࢀߟ• 書籍「実践ドメイン駆動設計」• 書籍「Reactive Messaging Patterns withthe Actor Model」• EIP - Java EE勉強会• イミュータブルデータモデル(入門編)