Kafka が Netflix の 1 日 2 兆件のメッセージを処理する方法

Kafka が Netflix の 1 日 2 兆件のメッセージを処理する方法

[51CTO.com からのオリジナル記事] 最初から、さまざまなマイクロサービスがさまざまな方法で相互に通信する必要があります。

[[253396]]

HTTP REST API を使用することを好む人もいますが、独自のキューの問題に遭遇する可能性があります。 RabbitMQ などの古いメッセージ キューを使用することを好む人もいますが、拡張や操作などの関連する問題を考慮する必要があります。

[[253397]]

そこで、上記 2 つの問題を解決することを目的とした Kafka ベースのアーキテクチャが誕生しました。

この記事では、Apache Kafka がこれまでマイクロサービスで使用されてきた HTTP REST API とメッセージ キュー アーキテクチャをどのように改善し、サービス機能をさらに拡張するかについて説明します。

二つの陣営の物語

最初のキャンプでは、HTTP REST API やリモート プロシージャ コール (RPC) などの他のサービスを呼び出すことによって通信が直接処理されます。

2 番目の陣営は、サービス指向アーキテクチャ (SOA) からエンタープライズ サービス バス (ESB) の概念を借用し、他のサービスとの通信を担当するメッセージ キュー (RabbitMQ など) をメッセージ エージェントとして使用して、さまざまな操作を実装しました。

この方法では、サービス間の直接的な「通信」による通信負荷を 1 つずつ軽減できますが、ネットワーク内に余分な「ホップ」のコストが追加されます。

HTTP REST API を使用したマイクロサービス

HTTP REST API は、サービス間で RPC を実行するための一般的な方法です。その主な利点は、初期設定が簡素化され、メッセージ送信の相対的な効率が向上することです。

ただし、このパターンでは、実装者はキューなどの問題や、受信リクエストの数がノードの容量を超える問題への対処方法を考慮する必要があります。

たとえば、長いサービス チェーンがあり、そのうちの 1 つがノードの処理能力を超えているとします。

次に、この問題に対処するために、サービス チェーン内のすべての先行サービスに対して同じタイプのバック プレッシャー処理 (翻訳者注: システムはソースまたはアップストリームの送信レートを適応的に削減します) を実行する必要があります。

さらに、このパターンでは、すべての個別の HTTP REST API サービスが高可用性である必要があります。そして、さまざまなマイクロサービスで構成された長いパイプラインでは、どのマイクロサービスもそのすべてのコンポーネントを失う余裕はありません。

したがって、特定のグループ内の少なくとも 1 つのプロセスが正常に機能している限り、通信は引き続き機能します。

もちろん、通常はこれらのマイクロサービスの前に負荷分散モジュールを構成する必要があります。同時に、さまざまなマイクロサービスが呼び出しを通じてどこで通信するかを知る必要があるため、サービス検出モジュールが必要になることがよくあります。

このモードの利点の 1 つは、レイテンシが非常に低いことです。特定のリクエスト パスでは仲介者の役割がほぼ排除されるため、Web サーバーや負荷分散などのコンポーネントは実戦テスト済みで、高いパフォーマンスを発揮します。

異なる RPC タイプのマイクロサービスの場合、それらの間の共通の依存関係を処理する必要があるため、すぐに非常に複雑になり、最終的には開発プロセスに影響を与えたり、開発プロセスを遅らせたりする傾向があることがわかります。

今日、業界ではいくつかの新しいソリューションも導入されています。たとえば、Envoy プロキシはサービス メッシュを使用してこの問題を解決します。

このパターンは負荷分散やサービス検出などの問題を解決しますが、単純で直接的な RPC 呼び出しと比較すると、システム全体の複雑さが大幅に増加します。

下の図に示すように、多くの企業では、最初は相互に通信する必要があるマイクロサービスが少数しかありませんが、システムが徐々に「成長」するにつれて、それらの間の呼び出し関係と通信チャネルは最終的にスパゲッティのボウルのように複雑になります。

[[253398]]

メッセージキュー

マイクロサービス間の通信を構築するもう 1 つの方法は、メッセージ バスまたはメッセージ キュー システムを使用することです。

以前のサービス指向アーキテクチャでは、これをエンタープライズ サービス バス (ESB) と呼んでいました。通常、メッセージ ブローカーとして RabbitMQ または ActiveMQ が必要です。

集中型メッセージ サービスとして、メッセージ ブローカーは、それに接続されているすべてのマイクロサービス間の通信を容易にすることができます。

同時に、キューイング処理メカニズムとメッセージ サービスの高可用性の助けにより、さまざまなサービス間の通信も保証されます。

たとえば、メッセージ キューのサポートにより、さまざまなメッセージを順番に受信して、システムが後続の処理を実行できるようになります。

リクエストのピークが発生し、処理能力の制限を超えた場合、システムは後続のキューを直接破棄しません。

ただし、多くのメッセージ ブローカーは、クラスター環境でのメッセージ配信および永続化機能にはスケーラビリティが欠けているか、制限されていることをユーザーに明示的に通知しています。

メッセージ キューで注目すべきもう 1 つの領域は、エラーが発生したときにそれをどのように処理するかです。

たとえば、システムの信頼性の高いメカニズムは、メッセージ送信プロセスにおいて少なくとも 1 回は保証できますか?それとも最大で1回しか保証できないのでしょうか?

もちろん、そのセマンティクスの選択は、メッセージ キューの実装によって完全に異なります。つまり、選択したメッセージとそれに伴うセマンティック ルールに精通している必要があります。

さらに、既存のシステムのアーキテクチャにメッセージ キューを追加すると、必然的に操作および保守する新しいコンポーネントが追加されます。

同時に、さまざまなメッセージを送信するために、ネットワークに新しい「ホップ」を追加すると、追加の遅延が発生し、Web サイトの待機も発生します。

客観的に言えば、このモデルは、さまざまなメッセージ キュー システムに集中型アクセス制御リスト (ACL) を使用することで、さまざまなセキュリティの問題を簡素化します。

つまり、この集中制御方式では、さまざまなルールを一律に適用して、誰がどのようなメッセージを読み書きできるかを制限します。

集中型通信のもう 1 つの利点は、ネットワーク セキュリティです。たとえば、以前は、すべてのマイクロサービスが独自に相互に通信していました。

メッセージ エージェントを導入すると、すべての接続をメッセージ キュー サービス経由で転送し、ファイアウォールのようなルール設定を通じて他のマイクロサービス間の直接接続を除外できるため、攻撃対象領域を減らすことができます。

Kafka中心の利点

LinkedIn によって作成された Apache Kafka は、オープンソースのイベント ストリーミング プラットフォームです。これまでの古いメッセージキューシステムと完全に異なるのは、送信者と受信者を完全に分離できる機能を備えていることです。つまり、送信者は送信したメッセージを誰が受け取るかを知る必要はありません。

[[253399]]

他の多くのメッセージ ブローカー システムでは、送信したメッセージを誰が読むかを事前に知っておく必要があります。これにより、従来のキューイング システムにいくつかの新しい未知のユース ケースを追加することが多少妨げられます。

Apache Kafka を使用する場合、送信者によってさまざまなメッセージがトピックと呼ばれるログのようなデータ ストリームに書き込まれ、誰が、またはどのアプリケーションが実際にメッセージを読み取るかを気にする必要はありません。

したがって、新しいユースケースでは、新しい用途に応じて Kafka の関連トピック コンテンツをどのように処理するかを検討する余地が残ります。

Kafka の場合、送信されるさまざまなメッセージの特定のペイロードを気にする必要がないだけでなく、メッセージを任意の方法でシリアル化することもできます。

そのため、ほとんどのユーザーは依然として JSON、AVRO、または Protobuf を使用してデータ形式をシリアル化しています。

さらに、ACL を簡単に設定して、システム内のさまざまなプロデューサーとコンシューマーが読み取りまたは書き込みできるトピックを制限できるため、すべてのメッセージに対する集中的なセキュリティ制御を実現できます。

その結果、潜在的に非常に大量のデータを取り込むために、Kafka がファイアホース スタイルのデータ パイプラインとして使用されることがよくあります。

たとえば、Netflix は Kafka を使用して 1 日あたり 2 兆件のメッセージを処理していると主張しています。

Kafka のコンシューマーには重要な特性があることに注目する価値があります。メッセージの負荷が増加すると、Kafka のコンシューマーは障害と容量要件の増加に応じて変化します。このとき、Kafka はコンシューマー間の処理負荷を自動的に再調整します。

開発者は、マイクロサービス内の高可用性の確保から Apache Kafka サービス自体に重点を移していることがわかります。

同様に、ストリーミング データを処理する Kafka の運用能力も、Kafka をメッセージング システムからストリーミング データ プラットフォームへと変革しました。

良いニュースとしては、Apache Kafka を使用するとネットワークに余分な「ホップ」が追加されますが、さまざまなリクエストに対するマイクロサービス通信バスとしてのレイテンシは増加 (または減少) しません。

つまり、上記の低レイテンシ、自動拡張、集中管理、成熟した高可用性により、Apache Kafka はマイクロサービスの通信開発において際立っており、さまざまなストリーミング データのリアルタイム分析に使用できる安定した動作環境を構築します。

[51CTO オリジナル記事、パートナーサイトに転載する場合は、元の著者とソースを 51CTO.com として明記してください]

<<:  ハイブリッドおよびマルチクラウドのアプローチの詳細

>>:  Aruba 802.11ax、究極のモバイルエクスペリエンス

推薦する

企業がビジネスをクラウドに移行する新たな理由

ポストエピデミック時代において、クラウド コンピューティングが企業にもたらすメリットは、設備投資の節...

Qutoutiaoにとっての解決策は何でしょうか?

今年第1四半期の「傑出した」業績がなかったら、沈没市場の3大巨頭の一つである趣頭条と「PKQ」に注目...

蒙牛は変化し、マーケティングはより洗練されてきた

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービステキスト | 脳を燃やす...

相互ポイントツールがウェブサイトSEOに及ぼす害

最近の百度の不安定さにより、ウェブマスターが一生懸命作った多くのウェブサイトが百度によって理由もなく...

Baidu の最適化は行き詰まりました。SEOER は他に何ができるでしょうか?

現在の検索エンジン最適化の発展から判断すると、新しいものは何もないようです。コンテンツのほかに、外部...

AWS が 8 つのカテゴリで 22 の新機能をリリース

[元記事は51CTO.comより] 米国時間2017年11月29日、Amazonの子会社であるAWS...

Kunpeng エラスティック クラウド サーバーの Node.js デプロイメントと高可用性を迅速に実装するにはどうすればよいでしょうか?

著者について: 知乎の有名人「王氏(仮名)」は、中国科学院計算技術研究所のコンピューターサイエンスの...

デスクトップ仮想化についてすぐに習得すべき 8 つの問題

デスクトップ仮想化テクノロジは、セキュリティ、管理性、柔軟性を向上させることが期待されているため、関...

ネットイースはモモCEOを非難する声明を発表

Momoが米国で上場しようとしていた12月10日早朝、NetEaseは突然声明を発表し、Momoの創...

Namecheap - 米国のドメイン名を 0.98 ドルで登録 (1 人あたり 5 件まで)

Namecheap の .me ドメイン名プロモーションは終了しましたが、今度は Namecheap...

Baidu Shareは次のBaidu Knowsになるかもしれない

Baidu を注意深く観察すると、最近、Google+1 や Facebook の「いいね!」に似た...

クラウド コンピューティングがビジネスの競争力を高める 8 つの理由

これまでにないほど多くの企業がクラウド コンピューティングに参入し、その利用を拡大しています。クラウ...

サン・マイクロシステムズ、クラウドコンピューティング事業拡大のためQ-layerを買収

2009 年 1 月 7 日、Sun は Q-layer の買収を発表しました。ベルギーに本社を置く...