[カフカ]「カフカDefinitive Guideのは、」 - カフカからデータを読み取ります

アプリケーションはKafkaConsumerはカフカにトピックをサブスクライブ、およびサブスクライブのトピックからメッセージを受信使用しています。読み出しデータは、カフカからの静かな他の情報システムからデータを読み取るとは異なり、それはいくつかのユニークなコンセプトやアイデアを必要とします。あなたが最初にこれらの概念を理解していない場合、消費者がAPIを使用する方法を理解することは困難です。だから我々は、これらの重要な概念、その後、いくつかの例を説明しようとしている、クロスは、消費者が異なるアプリケーションのためのAPIを使用する方法を示しています。

消費者や消費者団体

よく読むメッセージカフカのテーマは、これらのメッセージを確認し、それらを保存する - 私たちはからのアプリケーションのニーズを持っていると仮定します。アプリケーションは、消費者のオブジェクトを作成するトピックをサブスクライブし、メッセージの受信を開始し、その後もメッセージを確認するために結果を保存する必要があります。しばらくして、テーマの生産者は、より高速なアプリケーションプログラムの検証データの速度よりも行うにはどのようにこの時間はメッセージを書き込むには?唯一の消費者がメッセージを処理する場合は、アプリケーションが生成されたメッセージのスピードに追いつくことくらいだろう。明らかに、この時点では、消費者を拡大する必要があります。複数の生産者が同じテーマにメッセージを書き込むことができますように、我々はまた、複数の消費者が同じテーマ、メッセージ流用からメッセージを読み込むことができます。

コンシューマ・グループに属するカフカの消費者。消費者のグループは、同じテーマにサブスクライブする場合、各消費者は、パーティションのメッセージの件名部分を受信します。

テーマT1は、私たちが話題のT1に加入するためにそれを使用し、我々は唯一のコンシューマ・グループG1である消費者のC1を、作成した、4つのパーティションがあると仮定します。CL1消費者は、図4-1に示す4つのすべてのパーティションのT1に関連するメッセージを受信します。

あなたはC2の消費者グループG1を追加する場合は、各消費者は2つのパーティションからのメッセージを受信します。私は、消費者が、メッセージC1パーティション0とパーティション2、図4-2に示すメッセージエリア1とエリア3を、受信C2コンシューマを受けると仮定する。

グループG1は、4人の消費者を有する場合、各消費者は、図4-3に示されているパーティションに割り当てることができます。

私たちは、消費者のグループに、よりを追加する場合は、対象よりもパーティションの数は、そんなに消費者は、任意のメッセージを受信しません、アイドル状態になります。

スケール支出電源への主要な方法で、コンシューマ・グループを増やします。カフカの消費者は、多くの場合、データがデータベースやHDFSに書き込まれる、または時間のかかる計算にデータを使用しているなど、いくつかの高レイテンシの操作を行います。これらのケースでは、個々の消費者が生成されたデータの速度に追いつくことができない、彼らが、負荷、各コンシューマパーティションプロセスのスケールアウトの主要な手段であるメッセージの一部のみを共有するように、より多くの顧客を追加することが可能です。私たちは、負荷の増加は、より多くの消費者に追加することができ、パーティションのテーマを大量に作成する必要があります。しかし、性的な意味に、聞かせていない番号は、消費者のテーマパーティションの数を超えると、過剰消費者はアイドル状態になります。

加えて、個々の消費者アプリケーションを増加させることにより、横延伸するために、アプリケーションの複数の同一の被写体のデータを読み出す場合は、しばしば起こります。実際には、主要な設計目標の1カフカ、カフカのテーマは、さまざまなアプリケーションシナリオのニーズを満たすために、企業内のデータを作ることです。これらのシーンでは、各アプリケーションは、すべての情報が、それだけではなく一部を取得することができます。限り、各アプリケーションが独自のコンシューマ・グループを持っているとして、あなたは彼らがすべてのメッセージの件名を取得させることができます。従来のメッセージングシステムとは異なり、スケールカフカの消費者や消費者団体は、パフォーマンスに悪影響を与えません。

上記の例では、もし消費者がT1からトピックに関するすべてのニュースを受信するように、G2の消費者のみを含む新しいグループ、互いに独立し、G1群との間。グループG2は、図4-5に示すように、各消費者グループG1のように、いくつかのパーティションを消費することができ、より多くの消費者を追加することができます。全体として、グループG2は依然としてでまたは他の基の存在なしに、すべてのメッセージを受信します。

要するに、各グループにストレッチする能力と処理能力を読んで、消費者のグループを追加するには、1つのまたは複数のトピックにすべてのメッセージを取得する必要があり、すべてのアプリケーションのためのコンシューマ・グループを作成します消費者は、メッセージの一部に対処します。

消費者団体やパーティションのリバランス

私たちは、セクションからのテーマでパーティションを読むために、消費者のグループを学びました。新しいコンシューマ・グループを追加する場合、それは元のメッセージは、他の消費者が読むことを読み取ります。消費者がシャットダウンまたはクラッシュした場合、それがグループを離れますが、もともとそのパーティションでグループを読み取るために、他の消費者に読まれます。管理者など話題の変更は、新しいパーティションを追加する場合は、パーティションが再配分が起こるのだろう。

パーティションの所有権は別のコンシューマ1人の消費者から転送され、このような現象は、リバランスとして知られています。それは消費者団体のための高可用性と拡張性をもたらすため、リバランスは、(私たちが安全に追加したり、消費者を削除することができます)が重要であるが、通常の状況下では、我々はそのような行動を発生する必要はありません。リバランス時には、消費者たちは、グループ全体に短い時間を使用することはできませんメッセージを読み取ることができません。また、パーティションが別の消費者に再割り当てされたときに、消費者が現在の状態が失われて読み取るために、それはまた、状態は、アプリケーションが遅くなります再開する前にキャッシュをフラッシュする必要があるかもしれません。私たちは、安全性のとどのようにこの章の再均衡不要回避するためのバランスを直す方法について説明します。

グループコーディネーターブローカーとして消費者に割り当てられている(別のグループは、異なるコーディネーターを持つことができます)グループとその所属、パーティションの所有権を維持するために、ハートビートを送信します。限り、消費者が通常時のハートビート間隔を送って、それがパーティションはニュースでそれを読んでいることを示す、有効であると考えられました。消費者は、(メッセージを得るために)ポーリングにハートビート・メッセージを送信する場合、またはオフセットに出願されてもよいです。消費者が十分な長さのハートビートの送信を停止した場合、セッションの有効期限が切れ、グループのコーディネーターが、それは死んだと思う、それはリバランスがトリガされます。

消費者がクラッシュし、うまくメッセージを読むのをやめた場合は、グループのコーディネーター(ブローカー)は、リバランスの死をトリガーすることを確認するために、数秒間待ちます。時間のそれらの数秒で、消費者が読んでメッセージのパーティションを死ぬことはありません。消費者をクリーンアップすると、消費者はコーディネータがグループから脱退する必要があります通知されます、コーディネータはすぐに処理が一時停止を最小限にするために再バランスをトリガします。この章の後半の我々は、送信セッションの有効期限と心拍数を制御するための設定パラメータのいくつかを説明し、どのように実際のニーズに応じてこれらのパラメータを設定します。

パーティションの割り当てプロセスはどのようなものです

消費者がグループに参加したい場合は、JoinGroupグループコーディネーターに要求を送信します。消費者のグループに参加する最初は、「メイングループ。」になります メイングループリストのメンバーは、(リストは、すべての最近送信された消費者のハートビートを含み、それらがアクティブであると見なされる)グループのコーディネータから得られ、各消費者のパーティションに配布する責任があります。それは、消費者に割り当てされるべきパーティションを決定するために、インタフェースPartitionAssignorを実装するクラスを使用します。

カフカは、我々は、構成パラメータの後のセクションで説明します、2つの配布戦略を構築しました。配布が完了すると、リストの配布の主なグループには、グループのコーディネーター、コーディネーターに送られ、その後、すべての消費者に情報を送信します。各消費者は唯一、自分の割り当て情報を見ることができ、グループ内で唯一の主要なグループは、すべての消費者のための割り当て情報を知っています。このプロセスは、それが再バランスされるたびに繰り返されます。

カフカの消費者の作成

メッセージを読む前に、あなたはKafkaConsumerオブジェクトを作成する必要があります。KafkaConsumerは、オブジェクトを作成し、KafkaProducerオブジェクトを作成する非常に似ている - 属性の消費者は、Propertiesオブジェクトに渡したいです。この章の以降のセクションでは、深さ、すべてのプロパティに説明します。bootstrap.servers、key.deserializer、value.deserializer:ここでは、我々は唯一の3つの必須の属性を使用する必要があります。

次のコードは、KafkaConsumerオブジェクトを作成する方法を示します。

Properties props = new Properties();
 
props.put("bootstrap.servers", "broker1:9092, broker2:9092");
 
props.put("group.id", "CountryCounter");
 
props.put("key.deserializer", "org.apache.kafka.common.serializaiton.StrignDeserializer");
 
props.put("value.deserializer", "org.apache.kafka.common.serializaiton.StrignDeserializer");
 
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
复制代码

デシリアライザ指定されたクラス(デシリアライザ)Javaのバイト配列オブジェクトに変換されます。

group.idは、コンシューマ・グループに属しているKafkaConsumerを指定しました。必須ではありませんgroup.idが、今、私たちはそれが必要であることを前提としています。これは、コンシューマ・グループに属しているKafkaConsumerを指定します。創造は、消費者のいずれかのグループに属していないことも可能ですが、そうすることは、あまり一般的。

テーマを購読

消費者を作成した後、次のステップは、トピックをサブスクライブし始めることができます。サブスクライブ()メソッドは、パラメータとして話題のリストを受け入れ

consumer.subscribe(Collections.singletonList("customerCountries"));
复制代码

ここでは、単一の要素を含むリストを作成し、テーマの名前が「customerCountries」と呼ばれている、我々はまた、サブスクライブ()メソッドを呼び出すときに、誰かが作成した場合、正規表現が複数のトピックを一致させることができ、正規表現を渡すことができます新しいテーマ、テーマ名と正規表現のマッチングは、それはすぐに消費者が追加された新しいトピックを読むことができ、リバランスがトリガされます。アプリケーションが複数のトピックを読む必要があり、異なる種類のデータを扱うことができる場合は、このサブスクリプションは、非常に便利です。正規表現のファッションを使用してコピーしたデータは、カフカと他のシステム間で複数のトピックをサブスクライブするとき、それは一般的です。

(「テスト*。」)consumer.subscribe;:すべてのテスト関連のトピックを購読するには、あなたがこれを行うことができます

投票

APIは、ポーリングメッセージのコア消費者、単純なポーリングを介してサーバにデータ要求です。消費者が話題に加入すると、ポーリングは、調整グループを含む、すべての詳細を、ハンドルリバランスをゾーニング、データへのハートビートとアクセスをお送りします、開発者は、唯一のパーティションから返されたデータを処理するために、APIの簡単なセットを使用する必要があります。次のように消費者コードの主要部分です。

世論調査ではデータのみがそれほど単純では得られません。GroupCoordinatorの位置を特定するための責任がある新しい消費者投票()メソッドの最初の呼び出しは、グループに参加するには、割り当てられたパーティションを受け入れました。これが再び均衡発生した場合、全体のプロセスは、ポーリング中に行われます。もちろん、ハートビートが行くように破裂して、ポーリングから送信されます。したがって、我々は行ってどんな仕事がポーリング時にできるだけ早く扱われるべきであることを確認する必要があります。

スレッドセーフ

同グループでは、我々は消費者が複数のスレッドを実行できるようにすることはできません、複数のスレッドは、消費者が安全に共有できるようにすることはできません。原則として、消費者は、スレッドを使用します。あなたは同じコンシューマ・グループに複数の顧客を実行したい場合は、我々は独自のスレッド内のすべての消費者が実行するようにする必要があります。独自のオブジェクトにカプセル化して、すべての消費者が独自のスレッド上で実行されるように、複数のスレッドを起動するJava ExecutorServiceのを使用している消費者のロジックに優れています。

消費者の設定

これまでのところ、我々は消費者のAPIを使用する方法を学びましたが、唯一のいくつかの設定を紹介しbootstrap.servers、key.deserializer、value.deserializer、group.idとして「セックス11です。カフカの文書は、すべての関連する消費者の設定手順を示しています。ほとんどのパラメータは、一般的にそれらを変更する必要はありません、合理的なデフォルトを持っていますが、消費者は、パフォーマンスと可用性をたくさん持っていると、いくつかのパラメータがあります。次のこれらの重要な特性を紹介します。

1. fetch.min.bytes

この属性は、サーバーの消費者からレコードを取得するための最小バイト数を指定します。指定したサイズよりも小さい可能なデータの量がfetch.min.bytes場合、十分なデータがあるまで、消費者のデータ要求を受信すると、ブローカーは、それは待ちます、それが消費者に返却されたときに使用可能です。彼らがあちらこちら件名がメッセージを処理するために非常に活発な時間(またはピーク時間の日)ではないでは必要がないので、これは、ワークロードのブローカーと消費者を減らします。あなたが利用できる多くのデータを持っていないが、消費者のCPUの使用率が非常に高い場合は、プロパティの値がデフォルト値よりも大きい場合に設定する必要があります。消費者の数が多い場合、プロパティの値が少し大きすぎる設定されているブローカーの負荷を軽減することができます。

2. fetch.max.wait.ms

我々は、それが消費者に返却され、十分なデータがあるまで待つ、fetch.min.bytesによってカフカに語りました。fetch.max.wait.msは、指定されたブローカーのデフォルトの待機時間は500ミリ秒です。カフカに流入するための十分なデータがない場合、消費者は500msの遅延につながる、満たされていない要件の最小量のデータを取得します。(SLAを満たすために)潜在的な遅延を低減するために、パラメータ値が小さくなるように設定することができます。fetch.max.wait.msは100ミリ秒に設定され、fetch.min.bytesが1メガバイトに設定され、その後、消費者の要求を受信した後カフカ、データのいずれかのリターン1メガバイト、または100msの後に利用可能なすべてのデータを返している場合は、条件が満たされているかを確認します。

3. max.parition.fetch.bytes

この属性は、消費者に、各サーバー・パーティションから返される最大バイト数を指定します。そのデフォルト値は1MBです、すなわち、各パーティションレコードからKafkaConsumer.poll()メソッドが返すバイトを指定max.parition.fetch.bytesの最大。テーマは20のパーティションおよび5人の消費者を持っている場合は、各消費者は、レコードを受け取るために使用可能なメモリの4MB以上を必要とします。消費者のためにメモリを割り当てるときに、消費者のクラッシュのグループがある場合は、残して消費者が複数のパーティションを処理する必要があるため、それらを複数に割り当てることができます。メッセージの最大バイト数はそれ以外の場合は、消費者がこれらのメッセージを読むことができない場合があり、大きな(max.message.sizeプロパティの設定によって)、ブローカーよりも値max.parition.fetch.bytesを受け取ることができなければなりません、消費者が再ハングに主導されています再び。このプロパティを設定すると、考慮すべきもう一つの要因は、消費者データに対処するための時間です。消費者は、消費者が次回のポーリングに間に合うようにではないかもしれないが、処理に多くの時間を必要とする、データを返す)セッションが期限切れと単一のコールが(ポーリングする場合の分割は、あまりにも、リバランスを発生を避けるために()メソッドをポーリングするように頻繁に呼び出しを必要としますセッションの有効期限が切れないようにします。この問題が発生した場合、値が少しずつまたは拡張セッションの有効期限をmax.parition.fetch.bytesすることができます。

4. session.timeout.ms

この属性は、消費者がサーバーから切断死と見なされる前に、時間を指定し、デフォルトは3秒です。消費者が指定した時間内にグループコーディネータsession.timeout.msにハートビートを送信しない場合、それは死亡していると考えられていた、コーディネータは、リバランスを誘発する他の消費者のパーティションにグループに割り当てます。このプロパティは、heartbeat.interval.msに密接に関連しています。heartbeat.interval.msは、ポーリング()メソッドを指定コーディネータにハートビートを送信し、session.timeout.msハートビートを送信することはできませんどのくらいの消費者を指定します。したがって、これら2つのプロパティを変更する一般的な必要性は、heartbeat.interval.msはsession.timeout.ms、session.timeout.msの一般三分の一よりも小さくなければなりません。session.timeout.msは3Sであれば、heartbeat.interval.msはlsの必要があります。デフォルト値よりも設定session.timeout.ms値が小さい場合、それはすぐに検出し、ノードがクラッシュから回復するが、長いポーリングやガベージコレクションは、意図しないリバランスにつながる可能性ができます。この属性の値を大きく設定され、あなたは事故のリバランスを減らすことができますが、検出ノードの崩壊は時間がかかります。

5. auto.offset.reset

この属性は、オフセットなしで、消費者のリードを指定するか、または無効量のパーティションケース(起因する消費者長時間の障害のために、十分にオフセットを含む記録が削除廃止されました)何のためのプロセスをシフトします。デフォルト値はオフセット無効の下で、消費者は(消費者が録画を開始した後に生成された)最新の記録データの読み取りを開始します、ということを意味し、最新のものです。最古のオフセットの場合には無効である、ということを意味し、別の値であり、消費者は、パーティションからの記録開始位置を読み込みます。

6. enable.auto.commit

私たちは、後でいくつかの異なる方法を紹介相殺するために提出されます。このプロパティは、自動的に消費者のデフォルトのオフセット値がtrueで提出するかどうかを指定します。自身によって相殺提出するときに、データとデータ損失の重複を避けるために、それは偽のコントロールに設定することができます。それがtrueに設定されている場合、周波数も提出auto.commit.interval.mlsのプロパティを設定することにより制御することができます。

7. partition.assignment.strateg Y

私たちは、パーティションは、消費者のグループに割り当てられますことを知っています。PartitionAssignor与えられたテーマや消費者によると、消費者に割り当てられているすべきパーティションを決定します。カフカは、2つのデフォルトの割り当てポリシーを持っています。

- 範囲

いくつかの連続したパーティションは、ポリシーのテーマは、消費者に割り当てられます。消費者はトピックやテーマT1、T2、ウェルに加入し、各テーマには3つのパーティションを持っていながら、料金は静かC1とC2だったと仮定。次いで、おそらく消費者C1は、これらの2つのテーマパーティション2に割り当てられ、これらの2つのテーマパーティション0とパーティション1、および消費者C2に割り当てられます。各トピックは、パーティションの奇数を持っており、割り当てが主題の中に独立して行われるので、最初の消費者は、最終的に第二のパーティションよりも、より多くの消費者に割り当てられています。ただ、レンジ戦略を使用するだけでなく、パーティションの数は、消費者の数で割り切れることができない、それが起こるのだろう。

- ラウンドロビン

戦略は、個々の消費者にテーマに割り当てられたすべてのパーティションを置きます。パーティションコンシューマを分配消費者ラウンドロビンC1及びC2にポリシーは、次いで、消費者は、テーマT1 C1パーティション0とパーティション1およびT2に関連するパーティション2が割り当てられる場合、トピックは、消費者C2 T1とパーティションLに割り当てられましたテーマT2パーティション0とパーティション2。すべての消費者が(一般的です)、同じトピックをサブスクライブする場合、一般的には、ラウンドロビン配分戦略は、すべての消費者(パーティションまで後方または)パーティションの同じ数を与えます。

あなたはpartition.assignment.strategyを設定することにより、パーティション化戦略を選択することができます。デフォルトは組織である。Apache.kafka.clients.consumer.RangeAssignor、このクラスは、レンジ戦略を実装するだけでなく、org.apache.kafka.clients.consumer.RoundRobinAssignorにそれを変更することができます。また、この場合には、値がカスタムクラスpartition.assignment.strategyプロパティの名前で、カスタムポリシーを使用することができます。

8. client.id

このプロパティは、任意の文字列を指定することができ、Brokerはメトリックでは以上、一般的にログに使用されるクライアントから送信されたメッセージ、およびクォータを識別するためにそれを使用します。

9. max.poll.records

この属性は、あなたがポーリング処理に必要なデータの量を制御することができますレコードの数を返すように()メソッドを呼び出すために単一の呼び出しを制御するために使用されます。

send.buffer.bytes和10. receive.buffer.bytes

ソケットは読み出しで使用され、TCPバッファサイズを提供することができるデータを書き込みます。彼らは-1、オペレーティングシステムのデフォルト値に設定されている場合。生産者又は消費者とブローカーが異なるデータ・センターにある場合、データセンター間のネットワークは、一般に比較的高遅延及び低帯域幅を有するので、これらの値は適切に増加させることができます。

著者注に:私は金融、そう彼らの経験、インターネットは定期的にITを共有し、公共の数字に焦点を歓迎し、生活上の洞察力は、交換することを歓迎し、現在で就任のアリ - モバイル部門、大型プラントはまたあなたの履歴書、またはビューを削除するために、公開番号にプッシュすることができます私は、個人情報を取得します。(公開番号ID:weknow619)。

おすすめ

転載: juejin.im/post/5cf5c023f265da1b725bedb8