Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PhpStorm と Docker の壊し方 〜モジュラモノリスへの幻想と失敗〜

mpyw
April 11, 2022

PhpStorm と Docker の壊し方 〜モジュラモノリスへの幻想と失敗〜

2022/04/11 PHPer Kaigi 2022 の LT の発表内容です。

モジュラモノリスのコンテキスト分離戦略において,「仮想的にパッケージ分割して静的解析ツールで縛る」「本当にパッケージ分割する」の2通りがありますが,後者を選択した結果地獄を見てしまったのでその知見を共有します。

あと Docker Desktop for Mac はマジで壊れます

mpyw

April 11, 2022
Tweet

More Decks by mpyw

Other Decks in Programming

Transcript

  1. PhpStorm と Docker の壊し方 〜モジュラモノリスへの幻想と失敗〜 2022/04/11 PHPer Kaigi 2022 (LT)

    @mpyw
  2. お前誰? • こいつ → • @mpyw と書いてまっぴーと読むらしい • 最近ゆめみという会社に転職したらしい •

    Laravel 愛好家 [要出典] • #Laravelファサードと裁判してる党 依存性逆転の原則違反で の党首 [要出典] • モジュラモノリスで四苦八苦中
  3. ところで

  4. Docker を 壊したことが ある方?

  5. Docker (Desktop for Mac) は壊れる

  6. モジュラモノリスってなんだっけ? • 最近アツいやつ • PHPer Kaigi 2022 でもかなり注目されてる • Shopify

    が 2019年に提唱した • モノリスとマイクロサービスの中間的なアーキテクチャ
  7. モノリス モジュラモノリス マイクロサービス • 全部一緒くた • プライベートな部分 (ドメイン同士) は干渉し合わない •

    建物 (実行の単位) は1つ • 建物ごと分散
  8. モジュラモノリスの “キモ”

  9. ドメイン同士の境界 を厳格に守る

  10. 境界を超えたアクセスをしない状態を守らせる方法 • 特定の名前空間上で,クラスの use でのインポートや new でのインスタンス生成を禁じる ◦ https://github.com/spaze/phpstan-disallowed-calls ◦

    https://github.com/qossmic/deptrac (要するに仮想的なパッケージ分割) • 本当にパッケージ分割しちゃう ◦ composer.json を各パッケージが持つ ◦ モノレポ(1つのリポジトリ)で管理 ◦ 依存関係は最小にする ◦ インタフェース分離をし,依存性逆転の原則を適用する
  11. 本当に  分割しちゃえ 

  12. 構成例 src/ ├── composer.json ├── composer.lock └── packages/ ├── user/

    └── payment/ user/ ├── impl/ │ ├── src/ │ └── composer.json └── contract/ ├── src/ └── composer.json payment/ ├── impl/ │ ├── src/ │ └── composer.json └── contract/ ├── src/ └── composer.json ユーザ管理 アプリケーションルート 支払い
  13. 依存関係 実装は抽象にのみ 依存する! これいいんじゃない?

  14. 大事な問題

  15. vendor の インストール

  16. vendor をインストールすると…? src/ ├── composer.json ├── composer.lock ├── vendor/ └──

    packages/ ├── user/ └── payment/ user/ ├── impl/ │ ├── src/ │ ├── vendor/ │ └── composer.json └── contract/ ├── src/ ├── vendor/ └── composer.json payment/ ├── impl/ │ ├── src/ │ ├── vendor/ │ └── composer.json └── contract/ ├── src/ ├── vendor/ └── composer.json
  17. vendor をインストールすると…? payment/ ├── impl/ │ ├── src/ │ ├──

    composer.json │ └── vendor/ │ └── yumemi/ │ ├── user-contract/ ↩ │ └── payment-contract/ ↩ └── contract/ シンボリックリンクで ローカルパッケージを参照!
  18. 各パッケージを 独立して 開発できる! 解決!

  19. 本当?

  20. 「PHP ファイル解析するで! vendor も見といたるわ!」 「おっ!シンボリックリンクや!辿ろ」 「おっ!シンボリックリンクや!辿ろ」 「おっ!シンボリックリンクや!辿ろ」

  21. PhpStorm はシンボリックリンクを素直に再帰解析する • ローカルパッケージ同士の依存関係が入り組むと 無駄な解析が発生 • シンボリックリンクが自己再帰している場合, 無限再帰で永遠に終わらない ◦ PhpStorm

    が CPU をもぐもぐしてフリーズします 対処法はかなり面倒なので ここでは割愛
  22. パッケージごとにセットアップすることの大変さ • docker compose exec php bash ◦ cd packages/user/impl/src;

    composer install ◦ cd packages/user/contract/src; composer install ◦ cd packages/payment/impl/src; composer install ◦ cd packages/payment/contract/src; composer install • 面倒なのでシェルスクリプトの ./d ファイルと -p <package> オプションを整備して簡略化
  23. パッケージごとにセットアップすることの大変さ • ./d -p user,user-contract,payment,payment-impl composer install • ./d -p

    @all composer install 直列実行なので遅い まとめた
  24. 並列化 しちゃえ

  25. パッケージごとにセットアップすることの大変さ • ./d -p @all --parallel composer install ↑よし,コマンド並列実行で快適になるに違いない! やったか…?

  26. おや…?

  27. Docker の様子が…

  28. 現場の声

  29. 敗因 • Docker Desktop for Mac のファイル IO は 最弱

    • 並列書き込みに耐えられない どうする…?
  30. vendor は 共通化 しちゃえ

  31. vendor をシンボリックリンクで共通化 src/ ├── composer.json ├── composer.lock ├── vendor/ └──

    packages/ ├── user/ └── payment/ user/ ├── impl/ │ ├── src/ │ ├── vendor/ ↩ │ └── composer.json └── contract/ ├── src/ ├── vendor/ ↩ └── composer.json payment/ ├── impl/ │ ├── src/ │ ├── vendor/ ↩ │ └── composer.json └── contract/ ├── src/ ├── vendor/ ↩ └── composer.json
  32. 依存関係 最小化は CI だけで いいや

  33. そんなに甘くない

  34. 更なる問題 • ルートの composer.json 以外の autoload が PhpStorm に解析されない →

    一時的にルートの composer.json に全ての autoload を   取り込んでから dump-autoload → そもそも PhpStorm で一気に開くの諦める • ルートの composer.json 以外の require-dev が インストールされない → 一時的にルートの composer.json に全ての require-dev   を取り込んでから dump-autoload
  35. つらい…😢

  36. 戦犯↓ 本当に 分割しちゃえ

  37. ちなみに WebStorm は モノレポ構成 いけるそうです

  38. どうして PHP は…😢

  39. まとめ • PhpStorm でモノレポ構成のモジュラモノリスやるなら 仮想的なパッケージ分割だけで何とかしろ • 実際に分割するとマジで地獄です ◦ パッケージごとの CI

    が最小構成で回ってるのを見るのは美しいけどね… ◦ 大人しく静的解析ツールの機能に頼りましょう • Docker Desktop for Mac はよく死ぬ • PhpStorm もたまに死ぬ