マイクロサービスについて知っておいたほうが Kubernetes 登場の背景を知れそうな気がしてきたのでメモ
成長したシステムを大きなチームで運用するのは大変
いろんな課題がある
チームが大きいと...
- コミュニケーションコストが高い
- 意思決定コストが高い
システムが大きいと...
- 変更コストが高い
- 影響範囲が見えづらい
- 「歴史的経緯」が増えて学習コストが上がる
- テストやビルドに時間がかかる
- 最初に決定した言語、フレームワークに不向きな機能が
- インフラリソースを一部のリソースを食う機能のために合わせなければならない
そこでマイクロサービス化ですよ
チームとサービスを分割して効率化させる
チームが小さいと...
- コミュニケーションコストdown
- 意思決定コストdown
システムが適切に分割されていると...
- 各サービスの変更速度up
- 歴史的経緯の消滅 & 影響範囲が限定的
- 機能に最適化された、言語やフレームワークの選択
- テスト/ビルド時間の低下
- インフラリソースの効率化
- 各サービス毎に必要な部分だけスケールできる
ということは、最初からマイクロサービスじゃなくてよいの?
そう。
1つのチームが複数のサービスを管理するのはむしろ効率が悪い
それに、ある程度サービスが使われないと、分割の勘所も分からない
マイクロサービスにする際に気をつけることは
各チームに責任・権限をしっかり分担すること
- コミュニケーション&意思決定速度を上げるため
データもサービス毎に分割すること
ここをしっかり分けないと、マイクロサービス化する意味は薄い
大前提としてサービスをまたぐトランザクションが発生しないようにサービスを分割すべき 今回のように同一トランザクションでデータ更新をしたい処理であれば、サービス同士が疎結合ではないということであり、そもそもサービス分割の粒度が正しくない可能性が高い
各サービスが落ちていても動くように疎結合に設計すること
可用性が高くなる
でも、レコメンデーションエンジンの部分が独立して動いていれば、UI部分でレコメンデーションエンジンサービスの故障を検知したら、お薦めリストを表示しないというのもできるし、お薦めのデフォルトを呼び出すような事も可能になる。 こういう依存先サービスの故障を切り離すような機能をサーキットブレーカーと呼ぶ
ある程度の実装の重複は許容すること
下手に共有ライブラリとか作ると、その部分の変更コストが上がる
Cacoo の場合は gRPC サービスや RabbitMQ に関連する処理などがその典型です。これは microservices の特性上、許容すべきことです。共通の処理をライブラリ化してしまうという手もありますが、そうすると複数のサービスが同一のコードに依存してしまうため、microservices のメリットが減ってしまうことになります。
CacooはなぜKubernetesによるmicroservicesへの道を選んだのか? | ヌーラボ
マイクロサービスの欠点はあるの?
いくつかある。
- サービス間通信が複雑化する
- 各サービスが独自のデータベースを持つのでサービス間でデータの一貫性がなくなる
- アプリケーション全体の可用性が高まるとは限らない(1つのサービスの挙動が悪くなると全体に影響するケースもある
- 統合テストが大変になる
ASCII.jp:マイクロサービスの境界を決める「DDD」とは? (1/2)
あと、複数サービスが通信する関係上、モノリシックなサービスよりレスポンスは遅くなる
適切にサービスを分割するにはどうしたら良いの
ここが一番マイクロサービス化で難しいところらしい
DDDの「境界づけられたコンテキスト」単位で分けるのが適切らしいです(あんまりわかっていない
DDD本やマイクロサービスアーキテクチャを読むと理解できるのかも...?

- 作者: Eric Evans
- 出版社/メーカー: 翔泳社
- 発売日: 2013/11/20
- メディア: Kindle版
- この商品を含むブログ (8件) を見る

- 作者: Sam Newman,佐藤直生,木下哲也
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/02/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
マイクロサービスを動作させるのに適切な方法は何?
各サービスの機能をコンテナ化して、サービス毎のコンテナの集まりを管理するのがモダンらしい
これを実践するのに生まれたのが Kubernetes であるという認識
感想
- マイクロサービス化は、ハイコストハイリターンの「究極的な技術的負債の返済」だと感じた
- 当たり前だけれど「銀の弾丸」ではない
- サービス起動時から予め「このくらいの規模になったらマイクロサービス化を実施する」というのを経営陣と共有しておかないと難しそう
次回
マイクロサービスを理解したところで、それを実際に動作させるプラットフォームとしての Kubernetes を理解する