プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • マイクロサービス
  • 【マイクロサービス】概要(移行方法なども)
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【マイクロサービス】概要(移行方法なども)

07.09

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

マイクロサービス

巨大なシステムを見直すために考案された考え方。

特徴

  • ビジネスロジックを機能単位で分割します。
  • 機能ごとにサーバーを分けます。
  • 機能ごとが疎結合になっているので機能ごとにリリースが可能です。
  • 機能が小さいのでソースの見通しが良くなる。
  • 「結果整合性」になるので考慮は必要になる。
  • リソースの増強も機能ごとにできるので柔軟
  • ネットワーク負荷や、どのサービスが連携しているかの管理負荷は増大する。
  • アジャイル開発との相性が良いです。

モノリス

「マイクロサービス」と対極に位置する考え方です。

特徴

  • ビジネスロジックをプログラム単位で分割します。
  • 全てのビジネスロジックが一つのサーバーに置かれます。
  • プログラム間の関連が強いためリリース時に同期を取る必要があります。
  • リソースの増強はアプリケーション全体で行う必要がある。

向く事業

新規事業よりもドメイン境界がはっきりした成熟した事業にマイクロサービスは向く。

アセスメント

事業の目的や目標を明文化する。マイクロサービスも「銀の弾丸」ではないので採用する中でたくさんの課題が発生する。本当に採用するメリットがあるのかを検討すること。

一般的なマイクロサービス化の事業目的

  • 早くリリースしたい。
  • 障害発生率を下げたい。

組織/体制の変革

「レビンの変革プロセス」という考え方に沿って進める。

抵抗勢力への対処は「ジョンコッターの抵抗勢力に立ち向かう6つの対処法」に沿って進める。

Conwayの法則

「組織=システムアーキテクチャ」で組織が巨大化すると開発効率も悪くなる。

マイクロサービスと相性の良いコンテナ

マイクロサービスは一つ一つの単位が小さいためコンテナとの相性が良くなります。

分割単位

明確な定義はない。

個人的な感覚で「大きすぎると感じないサイズ」がちょうど良い分割単位とされます。

定義例

2週間で全てのコードを書き直せるレベルで分割するのが良いという人もいる。

注意点

全てのコードが書き直しになるわけではないので、不必要に何でもかんでもマイクロサービス化する必要性はないと思われます。

また、影響範囲が特定できるレベルで分割するのも望ましいとされます。

サービスとは?

何かしらの機能を実現する単独動作、単独デプロイ/リリースできるコンポーネント

含めるもの

  • API
  • サービス
  • データ

特にデータを含めるのは画期的と言えるでしょう。

マイクロサービスの課題

サービスの適切な分割範囲を見極めるのが難しい。

分割範囲を間違うとリリース時の複数サービス間の調整が必要になってしまう。

アプリケーションの設計が複雑になる。

複数サービスを同時修正しないといけない場合はリリースデプロイの調整が必要

分割範囲の見極めとも関わってくる話です。

アプリケーション全体のテストが難しい。

アプリの移行方法

一気にモノリシックからマイクロサービスに移行するのではなく徐々に移行していくことが推奨されている。

段階的な分割/再構築

ストラングラーパターンに沿って段階的に機能を移行していく。

共通の仕組み作り

DevOpsツールは何にするか、共通機能の導入(APIゲートウェイ)、開発準備(ドキュメント化ルール)

プロキシを活用する。

プロキシを挟んで古いサービスと、これから作成するマイクロサービスを振り分けるようにします。

メリット

モノリスに対する修正を減らせる。

デメリット

URL単位である程度機能として分割できている状態じゃないと使えない。

使用ソフト

NginxやKong

I/F定義を利用した分割

オブジェクト指向のストラテジーパターンを適用してインターフェースを使って分割します。別サービスを呼び出すときは、必ずインターフェース経由で呼び出すようにします。新サービスと旧サービスをインターフェースで切り替えます。

新旧の切り替えが終わったらモノリスな旧サービスは削除します。

メリット

複雑化してしまったコードでも分割ができる。

デメリット

モノリスに対する修正が必要になる(ストラテジーパターンを適用するために)のでリリースや調整が必要になってくる。

DBの移行

DBを物理分割する。

メリット

サーバーが物理的に分かれていると障害時の影響を下げることができます。

デメリット

データベースのライセンス費用がサーバーごとにかかってしまいます。もし、SQLServer、OracleなどライセンスがかかるRDBMSを活用しているのであれば、お金がかからないMySQL、PostgreSQLなどに置き換えることを検討します。

DBを論理分割する。

サーバーは同じでDBのスキーマだけ分ける手法です。

メリット

同じライセンスでいけるのでライセンス費用は抑えられる。

デメリット

1台のサーバーに対してコネクション数が増えることになるので注意が必要。

分割手法

データから分割

  1. 論理分割する。(新スキーマは書き込むだけ、旧スキーマは読み書きを行う。)
  2. 真とするデータの切り替え(CQRS、サーガなどを使う。)
  3. アプリや機能を移してあげる。
メリット

データに対して分割に問題ないか最初の段階で整合性確認がしやすい。

デメリット

マイクロサービスの効果を体感しづらい。(裏側から変えていくのでユーザーからしたら何も変わってないかのように見える。)

アプリから分割

  1. 新しいサービスを作る。
  2. 新スキーマを作る。
  3. 少しずつ新スキーマに処理を移していく。
メリット

マイクロサービスの効果を体感しやすい。

デメリット

意識的にデータ分割を行わないと潜在的なリスクを抱えたままになる。(早い段階で効果を感じるゆえにデータ分割が蔑ろになりかねない)

アプリとデータを同時に分割

  1. 論理分割(旧スキーマは読み書きを行い、新スキーマは書き込みだけ行う。)
  2. アプリも同時に分割する。
メリット

マイクロサービスの理想系にいきなり到達できる。

新機能はこの手法を取りやすいです。なぜなら新機能の場合は新しくスキーマ定義から行うことになるためです。(旧スキーマの実装が不要)

デメリット

修正コード量が増える。

スポンサーリンク
  • 2022 07.09
  • miyabisan2
  • コメントを書く
  • マイクロサービス
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2021 12.11

    【マイクロサービス】「コンテナオーケストレーション」とは?

  2. 2022 07.16

    【マイクロサービス】「データの整合性」の担保(サーガ)

  3. 2022 07.16

    【マイクロサービス】「メッセージブローカー」(AWSメッセージングサービス比較など)

  4. 2021 09.23

    【マイクロサービス】データの結合(「API Composition」、「CQRS」とは?)

  5. 2022 07.09

    【マイクロサービス】設計(通信、APIゲートウェイ、テスト、リリース手法、正常性確認、可観測性)

  6. 2021 12.05

    【設計】「キューイング」とは?

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Cypress】コマンド一覧

【マイクロサービス】設計(通信、APIゲートウェイ、テ…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • API
  • AWS
  • C++
  • CSS
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Git
  • GitLab
  • GraphQL
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • WebRTC
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー