プログラミングマガジン

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

  • ホーム
  • マイクロサービス
  • 【マイクロサービス】設計(通信、APIゲートウェイ、テスト、リリース手法、正常性確認、可観…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

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

07.09

  • miyabisan2
  • コメントを書く

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

設計:サービス間通信

マイクロサービスならサービス間の通信の手法を考える必要性が発生する。

数の分類

  • 1:1
  • 1:多

待ち受け方の分類

  • 同期通信
  • 非同期通信

マッピング表

1:1 1:多
同期通信 REST、gRPC なし
非同期通信 バッチ メッセージブローカー、DB共有

REST

メリット
  • どの言語でもサポートしている。
  • ツールが多い。
デメリット
動詞の種類に限りがある。
1リクエストで複数リソース操作ができない。

あくまで1リソースに対して1URLになる。

バッファリングなしに直接操作するため可用性が下がる。

gRPC

メリット
  • バイナリ+HTTP2で高速通信
デメリット
  • 古い環境だと対応していない。
  • 通信がバイナリなので監視が難しい。
  • swiftなど対応してない言語がある。

バッチ

メリット
  • 非同期にまとめて実行できる。
デメリット
  • 頻度を上げるとサーバーサイドの負荷になるので実行は夜間など負荷が低い時に限られる。
  • 反映まで時間がかかる。

メッセージブローカー

非同期にメッセージを交換する仕組み。専用ミドルウェアを使います。確実に後続サービスに通知を行ってくれます。

方式
キュー方式

貯めておく方式

Pub/Sub方式

パブリッシャーがプッシュする方式

メリット
  • 疎結合になる。
  • メッセージのバッファリングができる。
デメリット
  • パフォーマンスがボトルネックになる危険性がある。
  • 単一障害点になる可能性がある。
  • 運用複雑度が上がる。

DB共有

基本的にはマイクロサービスではアンチパターンになります。なぜならマイクロサービスの考え方としてDBのデータを含めてサービスとして独立させるという考え方のためです。

メリット
  • 大量データの移行が必要ない。
  • データ変更が即時反映される。
デメリット
  • データ変更に対する影響が広い。

外部公開

アプリ設計

データ整合性

セキュリティ

APIゲートウェイ

マイクロサービス化している課題の一つに複数サービスに分かれていると「あるサービスはアクセスさせて」、「あるサービスはアクセスさせない」など認証認可を一律で行いたいみたいな課題が出てきます。そこで登場するのが「APIゲートウェイ」です。サービスの入り口に関しては共通化してしまいましょうという考え方になります。

代表的なAPIゲートウェイ製品

Kong

一番有名な製品。OSS。Nginx上のLuaで動作。

Zuul(Netflix)

OSS。Javaで実装されている。

Tyk

たいくとよむ。OSS。Goで実装されている。軽量。高速。スケーラブル。

Apigee(Google Cloud)

クロスクラウドでAPI管理できる。

API Gateway(AWS)

フルマネージドサービス。認証認可などは別途LambdaやCognitoを使う。

用途

主に以下の用途で用いられます。

APIのエンドポイントの統一
認証認可

まずは、APIゲートウェイで認証を行い、マイクロサービスの各サービスで認可を行うようにする。という使い方をします。そうすることで統一的な認証認可の仕組みを導入することが可能になります。

認可を行いたい各サービスにOAuthサーバーを入れておき、APIゲートウェイをクライアントとしてアクセスしてもらいます。

設計:テスト

単体テスト

各サービス内のクラスのみで実施するテストです。(自動テスト)

課題

モックやスタブが大量に必要になってくる。

どうしても各サービスとの連携ができないのでモック化が増えます。基本的にはツールを利用して対応します。

  • OpenAPI
  • Mockito
  • nock
テストデータの初期化が都度必要

コンテナを利用して対応します。テストを実行する都度コンテナを入れ替えることでテストデータを初期化してあげます。

  • Docker
  • cri-o
  • OpenShift

結合テスト

依存関係のあるサービスのみを対象にテストします。

受け入れテスト

関連サービスを全て結合してテストします。よくあるウォーターフォールの発注側の会社内でのテストではなく、開発しているサービスが現状動作しているマイクロサービスのサービス群に受け入れられるかのテストになります。

E2Eテスト

全てのサービスを連携させてEnd To Endでテストします。ここがウォーターフォールで言うところの「受け入れテスト」に近いイメージになります。

結合テスト以降の課題

リリース物が増えるとどうしても手動ではやりきれなくなる。CI/CDを導入して自動デプロイ、自動リリースができるようにします。

  • Jekins
  • CircleCI

デプロイ/リリース

リリース手法の種類

リリース方法 切り替え台数 ダウンタイム
一括リリース 全台 (デプロイ方法次第)
カナリアリリース 一部 ほぼゼロ

一括リリース

ユーザー全員にいきなり公開するために使われる手法です。

カナリアリリース

いきなりユーザー全員に公開するのではなく限られた人にだけリリースしてフィードバックを受けるために使用します。

ユースケース

現状と大きく異なるようなUI/UXの効果を試したい場合など

CI/CDパイプライン

サービス正常性確認

正常性確認用のAPIを作成する。

エンドポイントのURLは「/health」、「/hc」などにしておけば良いでしょう。

正常であればレスポンスに200を返し、異常であれば500を返すようにします。(リクエストボディの中には正常性情報を埋め込まずあくまでステータスコードで確認できるようにするのが一般的です。)

チェック内容

アプリ自体が200を返すか。
DBにアクセスできるか。

以下のようなSQLを実行すれば良いでしょう。

1
SELECT 1 FROM DUAL

可観測性

マイクロサービスではたくさんサービスがあるのでどのサービスが問題になっているのかの障害発生箇所などが特定しずらいです。

複雑なシステムを横断的に監視できるようにするために三つのポイントがあります。

項目 説明
ログ収集 各サービスで発生するイベントの記録。モノリシックなシステムでもよく出てくる概念です。
メトリクス 各サービスの定量数値情報の記録。長期的な経過から問題になりそうか判断する。モノリシックなシステムでもよく出てくる概念です。
トレーシング リクエストに対する各サービス処理を記述

ログ収集

コンテナ化するとコンテナの破棄と生成を繰り返すのでログが消える可能性がある。なので、ログを一箇所に集約、永続化させることになります。

ログ送信エージェント

通信できないとロストするサービスが多い場合はログのバッファリングも検討します。

ログ収集

ビジュアライズ

ログ収集によく使われるツール

S3

アカツキではアクセスログ収集に使っている。

ElasticSearch Kibana

ログ収集、ビジュアライズができる。オンプレミスから使われるツール。ElasticSearchで完結できる構成。

Fluentd

ログ送信ができる。CNCF、ログ回収、フィルター、送信など各処理をプラグイン実行でき、送信時のバッファリング機能などを持っていたりして柔軟性が高いツール。

Prometheus Grafana

ログ送信、収集、ビジュアライズができる。Kubenetesとの統合がしやすい。製品自体の管理ができる。

Datadog

ログ送信、収集、ビジュアライズができる。SaaS。ログ収集、分析ができる。アカツキではミドルウェアのエラーログだけフィルタして溜めている。

CloudWatch Logs(AWS)

アカツキではアプリケーションのエラーログだけフィルタして溜めている。

Log Monitor(Azure)
Cloud Logging(GCP)

メトリクス収集

CPU使用率、メモリ使用率などです。ログ収集と同じく一箇所に収集していきます。よく使われるツールはログ収集のツールとほぼ同じです。

分散トレーシング

マイクロサービスでユーザーがどの経路を通ったか追跡したい場合があります。

ユーザーがどの経路をたどりどこで止まったのかを把握できて障害対応に活用することが可能です。

Trace

リクエスト全体。TraceIDによって特定します。

Span

各サービスの処理時間。必ずTraceの中にSpanは複数存在する関係性になります。SpanIDによって特定します。また、呼び出し元はParent SpanIDによって特定します。

OpenTelemetry

TraceやSpanなどを定義しておく情報。OpenTracingや、OpenCensusが元となった仕様。

代表的な分散トレーシングのツール

Zipkin

一番有名。Java実装。GoogleのZipperを参考にしてTwitterが作ったOSS。各言語の計測ライブラリがある。

Jaeger

Go言語実装。OpenTracing互換。各言語の計測ライブラリがある。

X-Ray

AWS純正の分散トレーシング。

サービスメッシュとは?

サービスとは別に外付けとして実装します。なので言語や環境には依存しないです。

外付け機能の例

kubenetesにおける「サイドカー」などがあります。

代表的なサービスメッシュ

lstio(Google、IBM、Lyft)

一番有名。高機能、YAML管理、Kubenetesのサイドカーとして自動導入できる。(というか、Kubenetes専用みたいな感じ)

Linkerd

利用実績が多い。(Expedia、Cisco webex、Walmartなど)

Conduit

Linkerd2.0へ吸収

Consul

エージェントを使ってサービス監視を行える。

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

関連記事

  1. 2022 07.09

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

  2. 2022 07.16

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

  3. 2021 12.05

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

  4. 2021 09.23

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

  5. 2022 07.16

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

  6. 2021 12.11

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

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

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

返信をキャンセルする。

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

【Git】「pre-commit」について

RETURN TOP

著者プロフィール

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

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

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • 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
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

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