Redis を使用してステートフル マイクロサービスをスケーリングする方法
LogicMonitor + Catchpoint: 自律型ITの新時代へ
最新のブログ、ホワイトペーパー、電子ガイドなどを直接受信ボックスにお届けします。
ビデオはまもなく始まります
LogicMonitor では、時系列メトリック データの取り込みと処理は、AI を活用したハイブリッド オブザーバビリティ プラットフォームの最も重要な部分であると言えます。成長、拡張、フォールト トレランスに完全に備えるために、私たちはメトリック処理パイプラインと呼んでいるものをモノリスからマイクロサービス駆動型アーキテクチャへと進化させました。私たちは以前、一連の記事で進化の過程を詳しく説明しました。
しかし、モノリス システムから分散型マイクロサービスおよびメッセージ駆動型アーキテクチャへの進化を進めるにつれて、新たな問題が発生しました。 この記事では、そのような問題の XNUMX つと、ソリューションをどのように設計したかについて詳しく説明します。
まず、高レベルの部分的なアーキテクチャの概要を考えてみましょう。 時系列メトリック データを取り込んだ後、データは最終的に Kafka トピックに送られ、そこでマイクロサービスによって消費および処理されます。 これは Kubernetes で実行され、 クォークス フレームワーク。 このマイクロサービスの複数のインスタンスを実行し、それらは同じインスタンスに参加します カフカ消費者グループ. Kafka トピックのパーティションはグループ内のコンシューマーに割り当てられ、サービスがスケールアウトすると、より多くのインスタンスが作成されてコンシューマー グループに参加します。 パーティションの割り当てはコンシューマー間で再調整され、各インスタンスは XNUMX つ以上のパーティションを取得して作業します。
このマイクロサービスは計算集約型のアプリケーションであり、 Kubernetes 水平ポッド オートスケーラー (HPA) CPU 使用率メトリックに基づいてアプリケーションのインスタンスを自動的にスケーリングします。
LogicMonitor では、複数の異なる データポイント メトリック タイプ 取り込んだ時系列データの場合。 ソースからデータを収集した後、メトリック タイプによって決定されるデータポイントの実際の値を生成するために、生データをさらに処理する必要があります。 この処理の要件として、Kafka からの着信メッセージを処理するときに、データポイントごとに以前の既存のデータをキャッシュする必要があります。 このように Kafka を使用する方法の詳細については、こちらをご覧ください。 この記事.
ここで、問題の核心に到達します。 スケーラビリティとスループットを最大化するために、計算負荷に基づいてスケールインおよびスケールアウトする、複数インスタンスのメッセージを消費するアプリケーションを構築しました。 さらに、Kafka コンシューマー グループのメンバーシップは本質的に非常に動的であり、さまざまなパーティションが同じグループ内の XNUMX つのコンシューマーから別のコンシューマーに移動する可能性があります。
ただし、前述したように、処理する各データポイントには、それに関連付けられた状態 (キャッシュされた既存のデータ) があります。 したがって、スケールダウン イベントが原因で Kubernetes ポッドが強制終了されることは、損失のないインシデントではありません。 これで、このポッドが処理していたデータ ポイントに関連付けられたコンテキストが失われます。 同様に、Kafka パーティションの再割り当てもロスレス インシデントではありません。 パーティションを取得する新しいコンシューマーは、パーティション内のデータ ポイントのコンテキストを持っていないか、古い古いコンテキストを持っています。
このコンテキストの喪失が発生するたびに、メトリクス処理で一時的な不一致が発生します。 Kubernetes ポッドのシャットダウンまたは Kafka パーティションの再割り当てによって発生する、このコンテキストの喪失に対処する必要があります。
一見したところ、これには明らかな解決策があるように見えます。コンテキストを保存するために使用してきたインメモリ キャッシュを、何らかの分散キャッシュに置き換えます。 ただし、そのソリューションをより複雑にする他の要因があります。
自然な解決策は、メモリ内キャッシュと外部分散キャッシュの中間点です。 コンテキスト データをメモリに保存し続けます。 このデータの損失を引き起こす XNUMX つのシナリオがあります。
これら XNUMX つのイベントがいつ発生したかを検出し、外部分散キャッシュへのコンテキスト データの永続化をトリガーできれば、「状態」を保存できるはずです。 その後、コンテキスト データを検索しているときに、メモリ内キャッシュに存在しない場合は外部キャッシュから検索し、見つかった場合はメモリ内キャッシュに挿入して復元します。状態。"
コンテナのシャットダウンとパーティションのリバランス中にコンテキスト データを外部の分散永続キャッシュに保存することで、オーバーヘッドをあまり発生させずにコンテキストを失うことができ、コンテキスト データの損失を回避できます。 コンテキスト データを外部キャッシュから検索するだけで (インメモリ キャッシュに見つからない場合)、オーバーヘッドが過度に増加することを回避できます。

クラスターモードを選択しました AWS ElastiCache Redis 分散キャッシュとして。 主な理由のいくつかを次に示します。
ソリューションの実装方法は次のとおりです。

LogicMonitor は引き続きモノリシック サービスをマイクロサービスに移行し、サービスの開発、展開、および保守方法を改善します。 旅行中の私たちの経験に関する他の記事をチェックしてください。
© LogicMonitor 2026 | 無断複写・転載を禁じます。 | ここで言及されているすべての商標、商号、サービス マーク、およびロゴは、それぞれの会社に帰属します。