Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 もたまに死ぬ