著者について Zhang Jinwei 氏は、Tencent Cloud のメッセージ キュー特別サポート チームのメンバーであり、Kafka と Puslar のシニア デベロッパーであり、Kafka SDK の貢献者でもあります。彼はストリーミング データ処理とメッセージ キューの分野で長年の実務経験を持っています。 Kafka の紹介Kafka は、リリースされてからほぼ 10 年になる分散メッセージ キュー システムです。大手企業や大手製品に多かれ少なかれ採用されている、非常に成熟した製品です。特に、ビッグデータ ストリーム処理やログ ストリーム処理などのシナリオでは、Kafka はほぼ不可欠な役割を果たします。 このメッセージ キューは、正式には「分散ストリーム処理プラットフォーム」として定義されています。その主な目的は、大規模なデータ ストリーム処理でレコード ストリームを保存することです。しかし、この時代では、より重くパフォーマンスが制限されている RabbitMQ の代わりに、メッセージ キューとして Kafka を使用することを好むビジネス アーキテクチャが増えています。 Kafka のようなシステムのシンプルさと高いパフォーマンスを確保するために、多くの論理的な詳細と構成が実際にはクライアント側に配置されます。したがって、ここではクライアントの視点から始め、プロデューサーとコンシューマーの両方を介したユーザーの視点から、実際の運用で Kafka が遭遇するいくつかの問題と対応する技術的な詳細を紹介します。この記事はプロデューサーを紹介するシリーズの第1回目です。 標準プロデューサー API の紹介ここではまず、最もよく使用されるプロデューサー API を紹介します。この記事を読んだら、あなたはすでに Kafka についてよく知っていると思います。ただし、後で使用される可能性のある用語をいくつか紹介するために、まず Kafka の基本的な概念を確認しましょう。ここでは、制作部分にのみ焦点を当て、その他の無関係な詳細は無視します。 まず、プロデューサーと Kafka 間の相互作用の図を描きます。この図は、プロデューサー メッセージ データのフローと、Kafka サーバーがメッセージを受信するために使用する必要があるコンポーネントを説明するために使用されます。 写真は上の通りです。それでは、図に描かれている内容とそれに対応する専門用語をそれぞれ紹介しましょう。
ここで、プロデューサー API の使用と、制作中に注意する必要があるいくつかの構成について説明します。ここでのプロデューサー API は、Kafka によって提供されるほぼステートレスな API を指し、非常に軽量で、優れたパフォーマンスも提供できます。ただし、この API を本番環境で使用する場合、Kafka は少なくとも 1 回と最大で 1 回のセマンティクスのみを保証します。
次に、コード スニペットを使用して、プロデューサー API の使用方法を確認し、いくつかの重要な構成を確認します。まず、それぞれに 2 つのレプリカがある 2 つのパーティションを持つトピックを作成しましょう。
それでは、Java プロデューサー スニペットを記述してみましょう。コードは非常にシンプルです。プロデューサー クライアント関連の構成をいくつか構成し、プロデューサーの send メソッドを呼び出して、Kafka クライアント ライブラリに送信するメッセージを送信するだけです。
上記のコードでメッセージの生成を完了できます。 Kafka が提供する API は実にシンプルで使いやすいです。もちろん、実際にはさらに詳細な情報が含まれていますが、それらはクライアントによってカプセル化されています。ここではさらに深く掘り下げて、このコードに潜む潜在的な落とし穴を確認します。 まず、このコードでクライアントが何を行うかを簡単に分析してみましょう。 (注: ここでは一般的なワークフローを示すことを優先しているため、Java クライアントの一部の固有機能は無視される場合があります)。 1. クライアントは、コードで指定された bootstrap.servers を介してブローカーに接続します。最初のブローカー接続が失敗した場合、クライアントは、すべての接続が失敗するか、1 つのアドレスが正常に接続されるまで、左から右へ接続を再試行します。 2. 接続が成功すると、Kafka クライアントは Kafka サーバーに ApiVersions リクエストを開始し、サポートされている各 API と各 API の最大サポートバージョンをサーバーに照会します。これにより、Kafka の下位互換性の目的が達成されます。もちろん、ApiVersions はバージョン 0.10 あたりで追加された API なので、新しいバージョンのクライアントが 0.9 バージョンの kafka サーバーにアクセスすると、ArrayIndexOutOfBoundsException エラーが発生します。このエラーは公式 Kafka 0.10 で修正されました。 3. 次に、クライアントは、メッセージが送信されるトピックのメタデータ情報を照会し、接続されたブローカーにメタデータ要求を送信します。この API を通じて、Kafka クライアントは、IP やポート、ブローカーに対応する一意の ID など、クラスター ブローカーに関するさまざまな情報を取得します。同時に、クライアントはトピック、パーティション ID、およびパーティションによって選択されたリーダー レプリカが配置されているブローカーの ID に関する関連情報も取得します。次に、クライアントは、実際にメッセージを送信するためのデータ リンクとして、リーダー レプリカが配置されているブローカーとの接続を確立します。 ここで注目すべき3つの点があります
4. クライアントは、メッセージ内のキーに基づいてハッシュを計算し、メッセージが配信されるパーティションを決定します。次に、クライアントはメッセージをローカル キューに配信します。パーティションに実際に接続されている配信クラスがキューからメッセージを取得します。次に、クライアントは 2 つのチェックを実行し、メッセージを配信するために生成要求を呼び出します。
5. このステップでは主に以下の設定を行います。
上記は、使用中のプロデューサー API 全体の詳細です。これらの詳細を理解すれば、運用中に Kafka で発生した奇妙なエラーを見つけて処理するためのアイデアが得られるでしょう。もちろん、コードの観点から見ると、上記の記事で説明されていないコード内の構成がいくつかあります。ここでは一緒に紹介します
冪等プロデューサーの紹介べき等プロデューサーは、単一のパーティション上のプロデューサーに対して正確に 1 回のセマンティクスを提供しますが、複数のパーティション上のプロデューサーの操作の一貫性をカバーすることはできません。この一貫性は、後続のトランザクション メッセージを通じて解決する必要があります。 それでは、べき等プロデューサーの使用方法と、関連する詳細の一部を見てみましょう。 なぜべき等プロデューサーを使用する必要があるのでしょうか?主な理由は、プロデューサーがサーバーにメッセージを送信した後、ネットワークの問題によって接続が切断された場合、プロデューサーはメッセージが正常に書き込まれたか失敗したかを認識できないことです。 Kafka の一般的なプロデューサー API では、再試行パラメータを設定し、常に再試行します。書き込みが成功したかどうかを認識できないため、これを「少なくとも 1 回」セマンティクスと呼びます。書き込みが成功したが、成功した応答を受信しなかった場合は再試行し、メッセージが繰り返し書き込まれることになります。メッセージの消費がメッセージの順序に依存する場合、この再試行によって順序が乱れる可能性もあります。 現在、べき等プロデューサーを使用すると、Kafka は再試行を実行するときにそのような重複したメッセージを破棄できます。 次に、べき等プロデューサーの使い方を見てみましょう。 (ここでコードを見てみましょう。コード内の重要でない構成は無視します)。
ユーザーの使用状況の観点から、べき等プロデューサーを有効にするには、enable.idempotence 設定を true に追加するだけです。引き続き詳細に注意を払い、べき等プロデューサーを有効にした後に kafka クライアントが何を行うかを確認しましょう。まず、クライアントはプロデューサーのいくつかの構成値を強制します。
プロデューサーの構成が完了すると、クライアントはプロダクション メッセージの送信を開始します。ここでは、前述の本番 API のロジックを省略し、冪等性を有効にした後の追加ロジックと手順のみに焦点を当てます。
上記の手順により、Kafka は単一パーティション操作の各コンシューマーの冪等性を保証します。これは、特にコンシューマー API を使用しており、acks がすでに all に設定されている場合に非常に実用的な機能です。プロデューサーの冪等性を有効にしても、追加コストはほとんどかかりません。これも Kafka が長らくリリースしてきた機能 (Kafka 0.11 以降でサポート) ですが、この機能を使用しているユーザーはまだ比較的少ないようです。 トランザクションメッセージングの概要トランザクション メッセージは現在、1 回限りのセマンティクスを保証するために Kafka によって提供される最も強力な制約です。これにより、プロデューサーが異なるパーティションに複数の相互に関連するメッセージを生成する場合、それらのメッセージが同時に成功するか、同時に失敗することが保証されます。同時に、トランザクション メッセージを有効にする前提として、べき等プロデューサーを有効にする必要があるため、べき等機能によって単一パーティション上の正確に 1 回のセマンティクスが保証されます。 ただし、一般的に、Kafka のトランザクション メッセージを直接使用する企業はほとんどありません。トランザクション メッセージの使用を伴うビジネスは、基本的に Kafka ストリームを介したストリーム処理です。 Kafka ストリームはトランザクション メッセージに依存しており、トランザクションの詳細を企業から隠します。ここでは、トランザクション メッセージを直接使用する方法を確認し、この期間中にクライアントが何を行うかを分析し続けます。まずはコードスニペットを公開しましょう。
まず、最初のステップとしてコード内で initTransactions が実行されます。このロジックでは、クライアントは InitProducerId を要求し、トランザクション ID を渡して、トランザクション ID と PID の間に 1 対 1 の関係を確立します。複数のプロデューサーが同じトランザクション ID に参加する場合、先に参加したプロデューサーは後に参加したプロデューサーに置き換えられます。以前のプロデューサーのリクエストはすべて拒否されます。 クライアントが短時間後に再接続する場合、InitProducerId を要求するときに、以前使用した PID とエポックを送信することに注意してください。成功した場合、サーバーはエポック+1 を返し、エポックが現在のエポックより小さいすべてのプロデューサー メッセージを拒否します。これは、分散システムにおけるいわゆるゾンビ問題を解決するためのものです。 その後のコード呼び出しは、多くのトランザクション コードと同じになります。トランザクションを開始し、書き込む必要のあるすべての情報を書き込み、最後にコミットします。失敗した場合はロールバックします。成功した場合、すべての書き込みがまとめてコミットされ、次のビジネス ロジックが実行されます。一般に、ほとんどのトランザクションはステート マシンとして実装されます。ここでは写真を載せて分析を続けません。 トランザクション コードを読んだところ、sendOffsetsToTxn 関数について言及していないようです。この関数は、現在のトランザクション メッセージがトピックから消費され、トランザクション メッセージに書き込まれるときに実際に使用されます。消費されたオフセットは、この機能を通じてコーディネータに送信され、その後、トランザクションがコミットされるときに、コンシューマーによって消費されたオフセットが一緒に送信されます。トランザクションの失敗を防ぐために、ユーザーはコンシューマー オフセットを手動で管理する必要もあります。非常に便利なヘルパー関数です。 要約するこれまで、Kafka プロデューサーのいくつかの使用法と、クライアントの観点から注意する必要がある落とし穴について簡単に分析しました。著者の記事は仕事で遭遇したいくつかの問題に基づいているので、いくつかの場所が使用され、より多くの人々がそれらを参考にするならば、もう少し詳しく書かれるかもしれません。問い合わせが少なく、問題も少ない場所であれば、よりシンプルな書き方で記述できるかもしれません。 この記事が読者の皆さんの役に立ち、Kafka プロデューサー部分についての理解を深めていただければ幸いです。読んでいただきありがとうございます。 Kafka コンシューマーについては次の記事でお会いしましょう。 |
<<: 実用的な情報:クラウドストレージの7つの利点と5つの欠点、この記事を読んでください
正直に言うと、4399ミニゲームプロダクトマネージャーのYin Jinqian氏の「大規模なキーワー...
xeepi (2010 年に設立されたとされている) は、Alipay 決済を正式にサポートすると発...
10 年間運営されているカナダの企業 Servarica が、新しい製品「GPU VPS」を開発しま...
現在、病院のオンラインマーケティングでは、ウェブサイトのレイアウトがますます美しくなってきています。...
世界最大のドメイン名サービスプロバイダーGoDaddyが目論見書を提出新浪科技ニュース:北京時間6月...
従来の仮想化と比較すると、Kubernetes コンテナはライフサイクルが短く、密度が高く、クラスタ...
ロイター通信によると、北京時間7月20日、フェイスブックのマーク・ザッカーバーグ最高経営責任者(CE...
Akamai といえば、初めてこの名前を聞いたという人も多いかもしれません。私は何年も前に360でC...
[51CTO.com クイック翻訳] ご存知のとおり、クラウド ストレージは、どこからでもタイムリー...
昨今のインターネットの発展のスピードは速すぎると言わざるを得ません。Weibo時代からビッグデータの...
【億騰電網ニュース】4月21日、JD.com POPプラットフォームとQQは本日共同で発表を行い、テ...
[[387865]]クラウド復旧戦略を構築することで、クラウド コンピューティング サービスを導入し...
近年、オンライン教育、ビデオ、エレクトロニクスなどの業界が急速な発展を遂げています。大規模、中規模、...
SEO コンサルティング サービスをしていたとき、5 つの基本的な SEO の問題によく遭遇しました...
ウェブマスターネットワークは15日、天猫が1日の取引高で191億の記録を樹立した後、来年の「双十一」...