超久々に記事記載。
最近マイクロサービス案件に携わることが多くなってきたのでちょっとまとめてみます。
マイクロサービスのすすめ
バグが多くなるプログラムとバグが少ないプログラムの違いを考えるとこんな感じのものがあるのではないでしょうか?
バグが多くなるプログラム
- ステップ数が多いプログラム
- 複雑怪奇なコード、ロジック、データ構造
- 共通化、再利用ができない(枯れないロジック、毎回テストが必要、同じようなロジックがあちこにに分散してメンテ漏れ)
で、こんな感じの重厚長大なプログラムばかりだと、やれば炎上、デスマーチ…
じゃ、 逆を行こう! ってなりますよね。
バグが少ないプログラム
- ステップ数の少ないプログラム
- 簡単なコード、単純データ構造
- 共通化、再利用して枯れたロジック
プログラムを極限まで細かく単純なデータ構造にして再利用可能な形で実装しよう! それって、マイクロサービス!!! ってなります。
イニシエの頃から UNIXという考え方 -その設計思想と哲学
UNIXは、MIT、GE、 AT&T社で共同開発していたMulticsという巨大なOSの開発プロジェクトが複雑すぎ遅々として進まなかったことの反省より、1969年にAT&T社のベル研究所が見切りをつけてプロジェクトを抜け、ケントンプソン、デニスリッチー、ブライアンカーニハン、ダグラスマキルロイ、マイクレスク、ジョーオサンナらによって開発が開始された。1994年にマイク・ガンカーツは、X-Window System開発チームでの経験を基に以下の哲学を創出しました。
- Small is beautiful(小さいものは美しい)
- Make each program do one thing well (1つのプログラムには1つのことをうまくやらせる)
って、Mike Gancarz (マイク・ガンカーツ) 1994年に言ってるんですね。30年前よ。

UNIXという考え方(オーム社)
AndroidもiOSも、実は中身はUNIX OSです。
よいプログラムとはハードウエアが大きく変わっても使われ続けられるんですね。
マイクロサービスとは?
マイクロサービスは、 2014年、ThoughtWorks社のマーチン・ファウラーとジェームス・ルイスが提唱したソフトウェアアーキテクチャ。小さく独立した複数のサービスでソフトウェアを構成する開発技法。下記に述べる特性を挙げている。
- サービスのコンポーネント化 - コンポーネントは独立して交換・更新可能なソフトウェアの単位である。
- ビジネス中心組織 -開発運用チームは技術や開発工程によるチームではなく、ビジネスを中心に機能横断型のチームが編成されている。
- プロジェクトではなくプロダクト - チームは開発完了とともに解散するプロジェクトモデルではなく、製品のライフサイクル全体に責任を持つ。
- スマートエンドポイントとダムパイプ - メッセージ通信は軽量かつシンプルであること。エンドポイントに高い機能を持たせ、通信はダムパイプ(メッセージのルータとしてのみ動作する単純な機構)であること。
- 分散統治 - 各サービスは独立したチーム、開発言語、ツールでアプローチする。
- 分散データ管理 - 概念モデルに関する分散だけでなく、データストレージも分散(サービス間で独立)する。
- インフラストラクチャの自動化 - テスト自動化/継続的デリバリー/継続的インテグレーションの導入
- 障害の設計 - 個々のサービスはいつでも失敗する可能性があるため、互いに障害を迅速に検出し、可能であれば自動的にサービスを復元できることが重要。
- 進化的な設計 - 頻繁に、迅速に、適切に制御されたソフトウェアの変更・廃止・構築を行うことができること。
ただし、これらは定義ではなく、すべての特性をもつ必要はないとしている。
Martin Fowler -Microservices
https://martinfowler.com/articles/microservices.html
サービスとは?
サービスとは機能を実現するために、単独で動作・デプロイ・リリースできるコンポーネントのこと。
- サービスを利用するためのAPI
- サービスを処理するロジック
- サービスのデータを保持するDB
を持つ。
ここでいうサービスとはWebサービスですね。
マイクロサービスは修正範囲が限定されるので利点がある。と説明されることが多いけど、限定されるようにサービスを分割する『設計力』が必要ということ。
オブジェクト指向プログラミングであっても構造化プログラムであっても、太古の頃から設計力の重要性については言われていますね。
すべてのシステムをマイクロサービス化してリプレイスすることは莫大なコストがかかるため一部の機能のみマイクロサービス化した場合のアーキテクチャを次は考えていきます。
以上