purucat’s blog

寿司よ止まれっ!

"「実践ドメイン駆動設計」から学ぶDDDの実装入門" 4章感想 (全14章)

"「実践ドメイン駆動設計」から学ぶDDDの実装入門"

「実践ドメイン駆動設計」から学ぶDDDの実装入門 (CodeZine Digital First)

「実践ドメイン駆動設計」から学ぶDDDの実装入門 (CodeZine Digital First)

のレビューをこまめに記載していく


良い所

(。・_・。) アーキテクチャの概要がいっぱい。スンナリ頭に入ってくれば君はアーキテクト!? 共通概念の言語化による共有という観点でココらへんの用語を適切に使えればコミュニケーションが簡便になると思われる。

悪い所

  • ESB (Enterprise Service Bus) が何なのか皆目見当がつかなかった (自分の事前知識不足)。 次のリンクをググって理解した。 https://arch.simplicable.com/arch/new/10-soa-design-patterns-every-architect-should-know の4や https://www.ibm.com/developerworks/jp/webservices/library/ws-universalports-esb/index.html 言語化すると次のようになる。
    • 2つのサービス間の接続の本数はサービス数が Nある場合は N(N-1)/2 つまりO(N2)のオーダーとなる(毛球問題)のに対応するのに導入されるサービスのことらしい。それぞれの接続が独自プロトコルを使用しているサービスならメンテナをやめようと思えてくるのは想像に固くない、、、 ESBを利用することで接続の本数をNにできる。
    • 2つのサービスを繋ぐためにプロトコル(http, iiop, etc...)変換機能を持つ。
    • 2つのサービスを繋ぐためにdata format(JSON, XML, etc..)変換機能を持つ。
  • 4.11 DDDにおけるCQRSでの流れに具体例がほぼないので一読ではよくわからない。例を上げるなら;
    • (1) GitHubにPull Requestを送るというコマンドで、はGitHub側で仮のmerge branchを作成したり自動でreviewerをアサインする仕組みがあればそれを実行する。
    • (2) Webhookが登録されていればPull Requestという「ドメインイベント」を発行してJenkinsなどに通知
    • ... と行った流れのことだろう。
    • Long-Running processesの説明が不正確?

気になった所

  • 専門用語が一気に出てくるため、よくわからなければ理解を深めるためにググる方が良い。

学んだ事

  • SOA (Service Oriented Architecture) は8つの設計原則をもつサービスのアーキテクチャ
  • 昔ながら3層(UI -> Web-Server -> DB-Server) もレイヤ化アーキテクチャの一種。
  • DIP (Dipendency Inversion Principle) によりドメイン層が依存されるだけの状態にする。これによりドメインの管理がしやすくなる。
  • 「ヘキサゴナルアーキテクチャ」はドメインを中心にとらえ、外部接続インタフェースである「ポート」の部分を差し替え可能である「アダプタ」とする。
  • CQRS (Command Query Responsibility Segregation) とは Command実行とQuery実行は別々の処理として分離しなければならないということ。
    • Command ::= *void* modify(...)
    • Query ::= *ImmutableType* get(...)
  • DDDの観点では「結果整合性」が許容される場合は使用することで複雑性を排除する。
  • システムが複数ある場合、イベントを扱うことで複数のシステム間の結合を疎にできる。
  • IDDDではイベント駆動のアーキテクチャとして次の3つを紹介している;
    • 「パイプ&フィルター」: UNIX コマンドに当てはめるとよい。パイプで分離することにより、再利用性やチューニングをしやすくできる。
    • 「長期プロセス(Long-Running processes)」:「並列でパイプラインを実行できる。」 とあるが主目的は、ユーザーからのレスポンスを待つ幾つかのストーリーが逐次実行されて初めて目的が達成されるという意味での正に「長期プロセス」のことである。 ref. https://www.slideshare.net/BerndRuecker/long-running-processes-in-ddd https://github.com/berndruecker/flowing-retail
    • 「イベントソーシング」: パターンの一つ。発生したすべてのイベントを「イベントストア」に記録する。「イベントストア」としてはKafka辺りで実現できそう。

分からないこと

  • DIPの実装として「DIコンテナ」、「サービスファクトリ」、「プラグイン」がある。

知らない概念が多かったので時間がかかった。この後は暫く簡易な概念が続くはず、、、