MSAは理屈が多く、手を動かさないとわからないことが多すぎるので作りました。
ついでに非同期I/OとサーバサイドReactiveを学ぶためにVert.xとRxJavaを採用しています。Spring Framework 5は別で学ぶ機会があるので一旦除外。ひとまず試行錯誤できる環境が用意できた状態です。
できていること
- マイクロサービスごとに独立したMavenプロジェクト
- docker-composeですべてのマイクロサービスを起動・リンクしての動作確認
docker-compose scale
でのマイクロサービスごとのスケールイン・スケールアウト- 非同期I/O主体のWEBサーバ開発
- マイクロサービス間のHTTP通信
- フロントエンド(UI生成とリクエスト受け付け)とバックエンド(FFmpegによる変換)の分離
- マイクロサービスごとに個別のDB(postgres)を用意
- Hashicorp Consulによるサービスディスカバリ
- Hazelcastをメッセージキューとしたマイクロサービス間でのイベントのやり取り
- nginx-proxyによるAPサーバ数増減への追随
認識できている課題
- 共通ライブラリ(common)がある。メッセージキューに突っ込むエンティティ(イベント)クラスを共有したり、UUID生成方法を統一したりするためだが、各マイクロサービスがライブラリのバージョンに対するコントロールを失う可能性がある。エンティティはJsonObjectのような汎用クラスで置き換えるべきかも。
- マイクロサービス間の通信に非効率なJSON&REST on HTTPを使っている。HTTP/2を入れたりgRPCに切り替えることでどの程度性能に影響があるのか見てみたい。
- メッセージキュー(Vert.xデフォルトのEvent Bus)がメッセージの伝達を保障しない。解消のために使い慣れたApache Kafkaに置き換えるか、Yahoo! Pulsarを試す機会にしたい。
- メッセージキューがグループをサポートしない。1つのイベントを複数の異なる種類のコンシューマが受け取るという、コレオグラフィ採用においてわりと重要なことがやりにくい。上述のKafkaかPulsarで解消できる。
- サーキットブレーカが無い。対象マイクロサービスが動いていないと、サービスディスカバリがNPEで落ちる。Vert.xがコンポーネントを提供しているが、インタフェースがいまいちっぽい。
- ユーザ認証がない。OAuthくらいは組み込みたい。Vert.xがコンポーネントを提供している。
- 監視の経験を積みたい。Vert.xはHawkular連携用のコンポーネントを提供している。
- REST APIのバージョン管理。HTTPヘッダかURLでバージョンを指定する手法が採れる。
- 本当にReactiveの利点が出ているか確信がない。特にback pressureについてはできていないのでは、Pumpだけでファイル-HTTP間ないしHTTP-HTTP間のback pressureが実現できているのだろうか。