Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

お前誰? ● こいつ → ● @mpyw と書いてまっぴーと読むらしい ● 最近ゆめみという会社に転職したらしい ● Laravel 愛好家 [要出典] ● #Laravelファサードと裁判してる党 依存性逆転の原則違反で の党首 [要出典] ● モジュラモノリスで四苦八苦中

Slide 3

Slide 3 text

ところで

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Docker (Desktop for Mac) は壊れる

Slide 6

Slide 6 text

モジュラモノリスってなんだっけ? ● 最近アツいやつ ● PHPer Kaigi 2022 でもかなり注目されてる ● Shopify が 2019年に提唱した ● モノリスとマイクロサービスの中間的なアーキテクチャ

Slide 7

Slide 7 text

モノリス モジュラモノリス マイクロサービス ● 全部一緒くた ● プライベートな部分 (ドメイン同士) は干渉し合わない ● 建物 (実行の単位) は1つ ● 建物ごと分散

Slide 8

Slide 8 text

モジュラモノリスの “キモ”

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

境界を超えたアクセスをしない状態を守らせる方法 ● 特定の名前空間上で,クラスの use でのインポートや new でのインスタンス生成を禁じる ○ https://github.com/spaze/phpstan-disallowed-calls ○ https://github.com/qossmic/deptrac (要するに仮想的なパッケージ分割) ● 本当にパッケージ分割しちゃう ○ composer.json を各パッケージが持つ ○ モノレポ(1つのリポジトリ)で管理 ○ 依存関係は最小にする ○ インタフェース分離をし,依存性逆転の原則を適用する

Slide 11

Slide 11 text

本当に  分割しちゃえ 

Slide 12

Slide 12 text

構成例 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 ユーザ管理 アプリケーションルート 支払い

Slide 13

Slide 13 text

依存関係 実装は抽象にのみ 依存する! これいいんじゃない?

Slide 14

Slide 14 text

大事な問題

Slide 15

Slide 15 text

vendor の インストール

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

vendor をインストールすると…? payment/ ├── impl/ │ ├── src/ │ ├── composer.json │ └── vendor/ │ └── yumemi/ │ ├── user-contract/ ↩ │ └── payment-contract/ ↩ └── contract/ シンボリックリンクで ローカルパッケージを参照!

Slide 18

Slide 18 text

各パッケージを 独立して 開発できる! 解決!

Slide 19

Slide 19 text

本当?

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

PhpStorm はシンボリックリンクを素直に再帰解析する ● ローカルパッケージ同士の依存関係が入り組むと 無駄な解析が発生 ● シンボリックリンクが自己再帰している場合, 無限再帰で永遠に終わらない ○ PhpStorm が CPU をもぐもぐしてフリーズします 対処法はかなり面倒なので ここでは割愛

Slide 22

Slide 22 text

パッケージごとにセットアップすることの大変さ ● 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 オプションを整備して簡略化

Slide 23

Slide 23 text

パッケージごとにセットアップすることの大変さ ● ./d -p user,user-contract,payment,payment-impl composer install ● ./d -p @all composer install 直列実行なので遅い まとめた

Slide 24

Slide 24 text

並列化 しちゃえ

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

おや…?

Slide 27

Slide 27 text

Docker の様子が…

Slide 28

Slide 28 text

現場の声

Slide 29

Slide 29 text

敗因 ● Docker Desktop for Mac のファイル IO は 最弱 ● 並列書き込みに耐えられない どうする…?

Slide 30

Slide 30 text

vendor は 共通化 しちゃえ

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

依存関係 最小化は CI だけで いいや

Slide 33

Slide 33 text

そんなに甘くない

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

つらい…😢

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

どうして PHP は…😢

Slide 39

Slide 39 text

まとめ ● PhpStorm でモノレポ構成のモジュラモノリスやるなら 仮想的なパッケージ分割だけで何とかしろ ● 実際に分割するとマジで地獄です ○ パッケージごとの CI が最小構成で回ってるのを見るのは美しいけどね… ○ 大人しく静的解析ツールの機能に頼りましょう ● Docker Desktop for Mac はよく死ぬ ● PhpStorm もたまに死ぬ