どうやってマイクロサービスアーキテクチャを稼動させるか興味を持ったので、調べたことをまとめました。
一番下に参考にしたURLがあります。
#マイクロサービスアーキテクチャとは
マイクロサービスアーキテクチャはJames Lewis氏によって提案された言葉で、
ソフトウェアアプリケーションを独立して配置可能なサービスの組み合わせ(suite)として設計する特定の方法を指すもの。
特徴
サービスが分離しているため、サービスごとに異なるプログラミング言語やストレージが選択でき、それぞれが独立してデプロイが可能になる。
Railsのモノシリックアーキテクチャと比較される。
メリット
変更に強い柔軟なシステムを作ることができる。
デメリット
分離したことによるAPIとネットワークの管理とシステムの整合性管理が必要
#分離したときにサービスが煩雑になるのを防ぐには
マイクロサービスのデザインパターンがあるのでそれぞれで対応する
- API Gateway:API群を一つにまとめる
- Service Registry / Service Discovery:API群を管理する
- Circuit Breaker:障害時に他のAPIを遮断し、波及を防ぐ
- Polyglot Persistence:異なるデータベースを扱える
- Command Query Responsibility Segregation (CQRS):読み込みと書き込みを分離する
- Tolerant Reader:送信を厳密に、受信を寛容に行う
- Chained Services:サービス同士を順列に接続する
- Asynchronous Messaging:メッセージを複数のサービスで共有する
- Service Instantiation:サービスをVM単位やホスト単位でインスタンス化する
- Consumer-Driven Contracts:消費者の期待するサービスを特化させ品質を上げる
- Domain Events...:サービス同士をつないで、分散型コレオグラフフィーを行うパターン
#複数に分散したAPIをまとめるには
API GatewayとService Registry / Service Discoveryを使う
APIをまとめて管理するサービスを用意する
Kongソフトウェアが主流で、APIをまとめて管理できる
- Kong:オープンソースソフトウェア、nginxとcassandraに依存している
#フロントエンドにAPIを合わせていくには
APIを時にはまとめてリクエスト回数を減らしたい場合などで、
BFF(Backends for Frontends)を用意し対応する。
- ユーザーとマイクロサービスの間に整形サービスを挟む
#通信が失敗したときのリトライ方法
何回もリトライすると負荷となり問題になるかもしれない
- エクスポネンシャルバックオフ(exponential backoff)を検討する
- 再試行時のwait間隔を徐々に(指数関数的に)伸ばす処理
#共通サービスをまとめるには
Kongのプラグインにてまとめることが可能
認証の追加(OAuth2.0)
セキュリティ(ACL,IP filtering, Bot Detection, CORS, DynamicSSL)
トラフィック制御(Rate Limiting)
ログ(TCP, HTTP, loggly)
#障害時に他のAPIを遮断し、波及を防ぐには
Circuit Breakerを使う
サービスの利用状況を検知して、それ以降のAPIにアクセスしないようにする
Rubyであれば、circuit_breaker,Expeditorライブラリがある
まとめ
- マイクロサービスを導入すると、柔軟性が生まれる。
- 分離したことによる考慮は必要になる。
- マイクロサービスにもデザインパターンがあるので活用する。
参考
マイクロサービスアーキテクチャ/O'REILLY