マイクロサービスの非同期通信とメッセージング|JFrog Xray

マイクロサービスはアプリケーションの構築方法を変えました。ソフトウェア設計は大規模なモノリシックなアプリケーション(変化や改善に適応できない)から、アジャイルな世界の変化に適応する小規模で独立したプロセスのインフラストラクチャの集合体へと移行しています。

マイクロサービスはどのように通信するのか?

マイクロサービスは互いに分離していますが通信できなければなりません。マイクロサービスのインフラストラクチャ内で通信を行う場合、最もポピュラーな1つが非同期通信です。

同期通信では他のタスクに移る前にレスポンスを待つ必要がありますが非同期通信ではマイクロサービス間でメッセージを送信し、他のタスクで作業を続けることができます。また、このアプローチは各マイクロサービスの独立性を高めることにもなります。マイクロサービスが停止した場合、障害を受けたマイクロサービスが再び稼働するまでタスクは保留されるため、他のサービスに影響を与えることはありません。非同期通信の最も良い例の一つが電子メールです。電子メールを送信した後、送信者は他の作業を継続でき、受信者が電子メールを読むまでの間、送信者は返信に頼らずに作業を継続することができます。

非同期通信の実装方法はメッセージキュー(宛先サービスがビジーな状態であったり、利用できない間に待機しているすべてのメッセージのための一時的なストレージ)を使用することで実現できます 。メッセージキューイングの基本的なアーキテクチャは非常にシンプルでプロデューサとコンシューマを使って実現します。プロデューサはメッセージを作成してキューに送信するアプリケーション/サービスです。コンシューマはキューに接続し、処理するメッセージを取得します。

メッセージキューイングを実装するためにプロデューサからメッセージを受け取り、コンシューマに渡すにはサービスのメッセージブローカーが必要です。メッセージはキューに直接公開されません。その代わりにプロデューサはメッセージを異なるキューにルーティングする交換機に送ります。メッセージはプロデューサに処理されてキューから削除されるまで存在します。

JFrog Xrayの場合

Microservices Communication and Messaging

JFrog Xrayには主に2つの作業フローがあります:

  • データベースの同期化 –  VulnDBなどのプレミアムリソースからのデータを含見ます。JFrogが管理するグローバルな脆弱性データベースサーバから問題と脆弱性に関するデータを毎日自動的に取得します。また、エアギャップ/DMZ環境では手動によるオフラインモードも可能です。
  • リソースのインデックス化 – インデックス化されたリソース内のコンポーネントに違反や脆弱性をインデックス化してマッチングします。
    このフローは新規と既存コンテンツの2つのフローに分けられます。

Xrayではマイクロサービス間の内部通信はすべて非同期でRabbitMQメッセージブローカーを使用して管理します。

: JFrog Xrayをすでにお使いですか?JFrog XrayのRabbitMQの詳細はこちらの記事をお読みください。

JFrog XrayがRabbitMQを使用する方法

Xrayはスキャン、インパクト分析、データベース同期など複数の重要な役割があります。これらの役割には異なるXrayサービスで同時に処理する必要があります。XrayはRabbitMQを使用してサービス間の通信を確認しながら、異なる処理を管理します。

RabbitMQはXrayで主に3つのタイプのキューを管理しています:

  • 新しいコンテンツ – システムに追加された新しいコンテンツに関連するイベントを処理します。例えばインデックス化するリポジトリに新しいアーティファクトがアップロード後にインデックスキューにメッセージが作成されます。
  • 既存コンテンツ – システム内の既存コンテンツを処理します。例えばリポジトリを再インデックス化後にこのキューにメッセージが送信されます。
  • リトライ – 失敗したメッセージはこのキューに送信され、TTLの間はそこに留まります。TTLの経過後、メッセージは元のキューに戻されます。

キュー名はサービス名とキュータイプによって定義されます(新しいコンテンツのキュー名にはサフィックスがありません)。この命名規則によってキュー名が予測できるため、RabbitMQキューをデバッグする際に便利です。

JFrog Xray queues in Xray's main flows

XrayのメインフローでのJFrog Xrayキュー

ワークフローを独立したキューに分離するアプローチはメッセージキューの負荷を削減し、より効率的な機能を提供します。

各Xrayマイクロサービスは「ワーカー」と呼ばれるコンシューマ数の設定を可能にしています。特定のキューに対するワーカー数を増やしたり、新しいXrayインスタンスをクラスタに追加したりすることで、ワーカーのスケールアップが可能です。各サービスのワーカー数を個別に調整することで、集中度の低いサービスには比較的少数のワーカーを割り当て、より必要とされるところでインスタンスリソースを利用することができ、Xrayのパフォーマンスを最適化することができます。

 

 

試してみてください

JFrog XrayはRabbitMQメッセージブローカーを使用して内部のマイクロサービスの非同期通信を行い、堅牢性とスケーラビリティを向上させています。

DevSecOpsを向上しつつ、この独立した非同期通信ベースのソフトウェアを体験してみませんか?Xrayを無料で使ってみましょ