メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第3ç«  カフカ

小さな本の翻蚳の続き:
メッセヌゞブロヌカヌを理解する
著者Jakub Korab、出版瀟O'Reilly Media, Inc.、発行日2017 幎 9781492049296 月、ISBNXNUMX。

以前に翻蚳された郚分: メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第1ç« ;序章

CHAPTER 3

カフカ

Kafka は、埓来のメッセヌゞ ブロヌカヌの制限の䞀郚を回避し、さたざたなポむントツヌポむント むンタラクション甚に耇数のメッセヌゞ ブロヌカヌをセットアップする必芁を避けるために LinkedIn によっお開発されたした。これに぀いおは、本曞の 28 ペヌゞの「スケヌルアップずスケヌルアりト」で説明されおいたす。ナヌスケヌス LinkedIn は、ペヌゞのクリックやアクセス ログなどの非垞に倧量のデヌタの䞀方向の取り蟌みに䞻に䟝存しながらも、プロデュヌサヌや他の消費者の生産性に圱響を䞎えるこずなく、そのデヌタを耇数のシステムで䜿甚できるようにしおいたす。 実際、Kafka が存圚する理由は、Universal Data Pipeline で説明されおいる皮類のメッセヌゞング アヌキテクチャを取埗するためです。

この最終目暙を考えるず、圓然他の芁件も生じたす。 カフカは次のこずを行う必芁がありたす。

  • 極めお速く行動する
  • メッセヌゞを凊理するずきにより倚くの垯域幅を提䟛したす
  • パブリッシャヌ/サブスクラむバヌおよびポむントツヌポむント モデルのサポヌト
  • 消費者の远加を遅らせないでください。 たずえば、宛先のコンシュヌマの数が増えるず、ActiveMQ のキュヌずトピックの䞡方のパフォヌマンスが䜎䞋したす。
  • 氎平方向にスケヌラブルであるこず。 メッセヌゞを保持する XNUMX ぀のブロヌカヌが最倧ディスク速床でのみメッセヌゞを保持できる堎合、パフォヌマンスを向䞊させるために単䞀のブロヌカヌ むンスタンスを超えおメッセヌゞを保持するこずは理にかなっおいたす。
  • メッセヌゞの保存ず再取埗ぞのアクセスを制限する

これらすべおを達成するために、Kafka はクラむアントずメッセヌゞング ブロヌカヌの圹割ず責任を再定矩するアヌキテクチャを採甚したした。 JMS モデルは非垞にブロヌカヌ指向であり、ブロヌカヌがメッセヌゞの配垃を担圓し、クラむアントはメッセヌゞの送受信のみを気にする必芁がありたす。 䞀方、Kafka はクラむアント䞭心であり、クラむアントは、非垞に高速でスケヌラブルなブロヌカヌず匕き換えに、消費者ぞの関連メッセヌゞの公平な配信など、埓来のブロヌカヌの機胜の倚くを匕き受けたす。 埓来のメッセヌゞング システムを䜿甚しおきた人にずっお、Kafka を䜿甚するには根本的な考え方の倉曎が必芁です。
この゚ンゞニアリングの方向性により、埓来のブロヌカヌず比范しおスルヌプットを䜕桁も向䞊できるメッセヌゞング むンフラストラクチャの䜜成が可胜になりたした。 埌で説明するように、このアプロヌチにはトレヌドオフが䌎いたす。぀たり、Kafka は特定の皮類のワヌクロヌドやむンストヌルされおいる゜フトりェアには適しおいたせん。

統合宛先モデル

䞊蚘の芁件を満たすために、Kafka は、XNUMX 皮類の宛先の䞋でパブリッシュ/サブスクラむブずポむントツヌポむント メッセヌゞングを組み合わせたした- トピック。 これは、メッセヌゞング システムを䜿甚したこずがある人々にずっおは混乱を招きたす。「トピック」ずいう蚀葉は、(トピックからの) 読み取りが氞続的ではないブロヌドキャスト メカニズムを指したす。 本曞の序文で定矩されおいるように、Kafka トピックはハむブリッド宛先タむプずみなされる必芁がありたす。

この章の残りの郚分では、特に明蚘しない限り、「トピック」ずいう甚語は Kafka トピックを指したす。

トピックがどのように動䜜するか、たたトピックがどのような保蚌を提䟛するかを完党に理解するには、たずトピックが Kafka でどのように実装されおいるかを確認する必芁がありたす。
Kafka の各トピックには独自のログがありたす。
Kafka にメッセヌゞを送信するプロデュヌサヌはこのログに曞き蟌み、コンシュヌマヌは垞に前進するポむンタヌを䜿甚しおログから読み取りたす。 Kafka は、その郚分のメッセヌゞが読たれたかどうかに関係なく、ログの最も叀い郚分を定期的に削陀したす。 Kafka の蚭蚈の䞭心的な郚分は、ブロヌカヌはメッセヌゞが読たれたかどうかを気にしないずいうこずです。それはクラむアントの責任です。

「ログ」ず「ポむンタ」ずいう甚語は、 Kafka ドキュメント。 ここでは、理解を助けるためにこれらのよく知られた甚語を䜿甚しおいたす。

このモデルは、すべおのキュヌからのメッセヌゞが同じログに保存され、ブロヌカヌがメッセヌゞを読み取った埌に削陀枈みずしおマヌクする ActiveMQ ずはたったく異なりたす。
ここで、もう少し深く掘り䞋げお、トピック ログをさらに詳しく芋おみたしょう。
Kafka ログは耇数のパヌティションで構成されたす (図3-1。 Kafka は、各パヌティションでの厳密な順序付けを保蚌したす。 これは、特定の順序でパヌティションに曞き蟌たれたメッセヌゞが同じ順序で読み取られるこずを意味したす。 各パヌティションは、次の内容を含むロヌリング ログ ファむルずしお実装されたす。 サブセット プロデュヌサヌによっおトピックに送信されたすべおのメッセヌゞのサブセット。 䜜成されたトピックには、デフォルトで XNUMX ぀のパヌティションが含たれおいたす。 パヌティションのアむデアは、氎平スケヌリングのための Kafka の䞭心的なアむデアです。

メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第3ç«  カフカ
図 3-1。 Kafka パヌティション

プロデュヌサが Kafka トピックにメッセヌゞを送信するずき、メッセヌゞをどのパヌティションに送信するかを決定したす。 これに぀いおは埌ほど詳しく芋おいきたす。

メッセヌゞを読む

メッセヌゞを読みたいクラむアントは、ず呌ばれる名前付きポむンタを管理したす。 消費者団䜓を指したす。 オフセット パヌティション内のメッセヌゞ。 オフセットは、パヌティションの先頭の 0 から始たる増分䜍眮です。 このコンシュヌマ グルヌプは、API でナヌザヌ定矩の group_id を介しお参照され、以䞋に察応したす。 XNUMX ぀の論理コンシュヌマたたはシステム.

ほずんどのメッセヌゞング システムは、耇数のむンスタンスずスレッドを䜿甚しお宛先からデヌタを読み取り、メッセヌゞを䞊列凊理したす。 したがっお、通垞は、同じコンシュヌマ グルヌプを共有する倚くのコンシュヌマ むンスタンスが存圚したす。

読解の問題は次のように衚すこずができたす。

  • トピックには耇数のパヌティションがありたす
  • コンシュヌマの耇数のグルヌプが同時にトピックを䜿甚できる
  • コンシュヌマのグルヌプは耇数の個別のむンスタンスを持぀こずができたす

これは、自明ではない倚察倚の問題です。 Kafka がコンシュヌマ グルヌプ、コンシュヌマ むンスタンス、パヌティション間の関係をどのように凊理するかを理解するために、埐々に耇雑になる䞀連の読み取りシナリオを芋おみたしょう。

消費者および消費者団䜓

開始点ずしお、XNUMX ぀のパヌティション (図3-2).

メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第3ç«  カフカ
図 3-2。 コンシュヌマがパヌティションから読み取る

コンシュヌマ むンスタンスが独自の group_id を䜿甚しおこのトピックに接続するず、読み取りパヌティションずそのパヌティション内のオフセットが割り圓おられたす。 このオフセットの䜍眮は、最新の䜍眮 (最新のメッセヌゞ) たたは最も叀い䜍眮 (最も叀いメッセヌゞ) ぞのポむンタヌずしおクラむアントで構成されたす。 コンシュヌマはトピックからメッセヌゞをリク゚スト (ポヌリング) し、これによりメッセヌゞがログから順番に読み取られたす。
オフセット䜍眮は定期的に Kafka にコミットされ、内郚トピックにメッセヌゞずしお保存されたす。 _consumer_offsets。 通垞のブロヌカヌずは異なり、読み取りメッセヌゞは削陀されず、クラむアントはオフセットを巻き戻しお、すでに衚瀺されたメッセヌゞを再凊理できたす。

XNUMX 番目の論理コンシュヌマが別の group_id を䜿甚しお接続するず、最初のポむンタから独立した XNUMX 番目のポむンタを管理したす (図3-3。 したがっお、Kafka トピックは、XNUMX ぀のコンシュヌマヌが存圚するキュヌのように機胜し、耇数のコンシュヌマヌがサブスクラむブする通垞のパブリッシュ/サブスクラむブ (pub-sub) トピックのように機胜したす。さらに、すべおのメッセヌゞが保存され、耇数回凊理できるずいう利点もありたす。

メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第3ç«  カフカ
図3-3。 異なるコンシュヌマ グルヌプ内の XNUMX ぀のコンシュヌマが同じパヌティションから読み取る

消費者グルヌプの消費者

XNUMX ぀のコンシュヌマ むンスタンスがパヌティションからデヌタを読み取るずき、ポむンタを完党に制埡し、前のセクションで説明したようにメッセヌゞを凊理したす。
コンシュヌマヌの耇数のむンスタンスが同じ group_id で XNUMX ぀のパヌティションを持぀トピックに接続されおいる堎合、最埌に接続したむンスタンスにポむンタヌの制埡が䞎えられ、その瞬間からすべおのメッセヌゞを受信したす (図3-4).

メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第3ç«  カフカ
図3-4。 同じコンシュヌマ グルヌプ内の XNUMX ぀のコンシュヌマが同じパヌティションから読み取る

コンシュヌマ むンスタンスの数がパヌティションの数を超えるこの凊理モヌドは、䞀皮の排他的コンシュヌマず考えるこずができたす。 これは、コンシュヌマ むンスタンスの「アクティブ-パッシブ」(たたは「ホット-りォヌム」) クラスタリングが必芁な堎合に圹立ちたすが、耇数のコンシュヌマを䞊行しお実行する (「アクティブ-アクティブ」たたは「ホット-ホット」) こずの方がはるかに䞀般的です。消費者はスタンバむ状態です。

䞊で説明したこのメッセヌゞ配垃動䜜は、通垞の JMS キュヌの動䜜ず比范するず驚くべきものになる可胜性がありたす。 このモデルでは、キュヌに送信されたメッセヌゞは XNUMX ぀のコンシュヌマヌ間で均等に分散されたす。

ほずんどの堎合、コンシュヌマヌの耇数のむンスタンスを䜜成するずきは、メッセヌゞを䞊行しお凊理するか、読み取り速床を向䞊させるか、読み取りプロセスの安定性を高めるためにこれを行いたす。 パヌティションからデヌタを読み取るこずができるのは䞀床に XNUMX ぀のコンシュヌマヌ むンスタンスだけですが、Kafka ではこれをどのように実珟するのでしょうか?

これを行う XNUMX ぀の方法は、単䞀のコンシュヌマヌ むンスタンスを䜿甚しおすべおのメッセヌゞを読み取り、スレッド プヌルに枡すこずです。 このアプロヌチは凊理スルヌプットを向䞊させたすが、コンシュヌマ ロゞックの耇雑性は増倧し、読み取りシステムの堅牢性を向䞊させるこずはできたせん。 停電たたは同様のむベントによりコンシュヌマの XNUMX ぀のコピヌがダりンした堎合、枛算は停止したす。

Kafka でこの問題を解決する暙準的な方法は、 b を䜿甚するこずです。Оより倚くのパヌティション。

パヌティショニング

パヌティションは、単䞀のブロヌカヌ むンスタンスの垯域幅を超えおトピックの読み取りずスケヌリングを䞊列化するための䞻芁なメカニズムです。 これをよりよく理解するために、XNUMX ぀のパヌティションを持぀トピックがあり、XNUMX 人のコンシュヌマヌがこのトピックをサブスクラむブする状況を考えおみたしょう (図3-5).

メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第3ç«  カフカ
図3-5。 XNUMX 人のコンシュヌマヌが耇数のパヌティションから読み取りたす

このシナリオでは、コンシュヌマヌは䞡方のパヌティションの group_id に察応するポむンタヌに察する制埡を䞎えられ、䞡方のパヌティションからメッセヌゞの読み取りを開始したす。
同じ group_id の远加のコンシュヌマヌがこのトピックに远加されるず、Kafka はパヌティションの XNUMX ぀を最初のコンシュヌマヌから XNUMX 番目のコンシュヌマヌに再割り圓おしたす。 その埌、コンシュヌマの各むンスタンスはトピックの XNUMX ぀のパヌティションから読み取りたす (図3-6).

メッセヌゞが 20 スレッドで䞊列凊理されるようにするには、少なくずも 20 のパヌティションが必芁です。 パヌティションの数が少ない堎合は、排他的コンシュヌマの説明で前述したように、䜕も凊理する必芁のないコンシュヌマが残されたす。

メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第3ç«  カフカ
図3-6。 同じコンシュヌマ グルヌプ内の XNUMX ぀のコンシュヌマが異なるパヌティションから読み取りたす

このスキヌムにより、JMS キュヌを維持するために必芁なメッセヌゞ配垃ず比范しお、Kafka ブロヌカヌの耇雑さが倧幅に軜枛されたす。 ここでは、次の点を心配する必芁はありたせん。

  • ラりンドロビン割り圓お、プリフェッチ バッファの珟圚の容量、たたは前のメッセヌゞ (JMS メッセヌゞ グルヌプの堎合) に基づいお、どのコンシュヌマが次のメッセヌゞを受信する必芁があるか。
  • どのメッセヌゞがどのコンシュヌマに送信されるか、たた倱敗した堎合にはメッセヌゞを再配信する必芁があるかどうか。

Kafka ブロヌカヌが行う必芁があるのは、コンシュヌマがメッセヌゞを芁求したずきに、コンシュヌマにメッセヌゞを順番に枡すこずだけです。

ただし、校正ず倱敗したメッセヌゞの再送信を䞊列化する芁件はなくなりたせん。それらの責任は単にブロヌカヌからクラむアントに移されるだけです。 これは、コヌド内でそれらを考慮する必芁があるこずを意味したす。

メッセヌゞの送信

どのパヌティションにメッセヌゞを送信するかを決定するのは、そのメッセヌゞの䜜成者の責任です。 これが行われるメカニズムを理解するには、たず実際に䜕を送信しおいるのかを考える必芁がありたす。

JMS ではメタデヌタ (ヘッダヌずプロパティ) ずペむロヌド (ペむロヌド) を含む本文を含むメッセヌゞ構造を䜿甚したすが、Kafka ではメッセヌゞは次のようになりたす。 「キヌず倀」のペア。 メッセヌゞ ペむロヌドは倀ずしお送信されたす。 䞀方、キヌは䞻にパヌティション化に䜿甚され、次のものが含たれおいる必芁がありたす。 ビゞネスロゞック固有のキヌ関連するメッセヌゞを同じパヌティションに配眮したす。

第 2 章では、関連むベントを XNUMX 人の消費者が順番に凊理する必芁があるオンラむン ベッティング シナリオに぀いお説明したした。

  1. ナヌザヌアカりントが蚭定されたした。
  2. お金がアカりントに入金されたす。
  3. アカりントからお金を匕き出す賭けが行われたす。

各むベントがトピックに投皿されたメッセヌゞである堎合、自然キヌはアカりント ID になりたす。
Kafka プロデュヌサヌ API を䜿甚しおメッセヌゞが送信されるず、そのメッセヌゞはパヌティション関数に枡され、メッセヌゞず Kafka クラスタヌの珟圚の状態に応じお、メッセヌゞの送信先ずなるパヌティションの ID が返されたす。 この機胜は、Partitioner むンタヌフェむスを介しお Java に実装されたす。

このむンタヌフェヌスは次のようになりたす。

interface Partitioner {
    int partition(String topic,
        Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
}

パヌティショナヌの実装では、キヌに察しおデフォルトの汎甚ハッシュ アルゎリズムを䜿甚しおパヌティションを決定するか、キヌが指定されおいない堎合はラりンドロビンを䜿甚したす。 ほずんどの堎合、このデフォルト倀が適切に機胜したす。 ただし、将来的には、独自のコヌドを䜜成するこずになるでしょう。

独自のパヌティショニング戊略を䜜成する

メッセヌゞ ペむロヌドずずもにメタデヌタを送信する䟋を芋おみたしょう。 この䟋のペむロヌドは、ゲヌム アカりントに入金するための呜什です。 呜什は、送信時に倉曎されないこずを保蚌したいものであり、信頌できる䞊流システムのみがその呜什を開始できるこずを確認したいものです。 この堎合、送信システムず受信システムは、メッセヌゞを認蚌するために眲名を䜿甚するこずに同意したす。
通垞の JMS では、単に「メッセヌゞ眲名」プロパティを定矩し、それをメッセヌゞに远加したす。 ただし、Kafka はメタデヌタを枡すためのメカニズムを提䟛せず、キヌず倀のみを提䟛したす。

倀は敎合性を保持したい銀行振蟌ペむロヌドであるため、キヌで䜿甚するデヌタ構造を定矩する以倖に遞択肢はありたせん。 アカりントに関連するすべおのメッセヌゞを順番に凊理する必芁があるため、パヌティショニングにアカりント ID が必芁であるず仮定するず、次の JSON 構造が考えられたす。

{
  "signature": "541661622185851c248b41bf0cea7ad0",
  "accountId": "10007865234"
}

眲名の倀はペむロヌドに応じお倉化するため、パヌティショナヌ むンタヌフェむスのデフォルトのハッシュ戊略では関連メッセヌゞを確実にグルヌプ化できたせん。 したがっお、このキヌを解析し、accountId 倀を分割する独自の戊略を䜜成する必芁がありたす。

Kafka には、ストア内のメッセヌゞの砎損を怜出するためのチェックサムが含たれおおり、セキュリティ機胜の完党なセットが備わっおいたす。 それでも、䞊蚘のような業界固有の芁件が発生するこずがありたす。

ナヌザヌのパヌティション化戊略では、関連するすべおのメッセヌゞが同じパヌティションに収たるようにする必芁がありたす。 これは単玔そうに芋えたすが、関連するメッセヌゞの順序付けの重芁性ずトピック内のパヌティション数がどのように固定されおいるかにより、芁件が耇雑になる堎合がありたす。

トピック内のパヌティションの数は、トラフィックが圓初の予想を超えた堎合に远加される可胜性があるため、時間の経過ずずもに倉化する可胜性がありたす。 したがっお、メッセヌゞ キヌは、最初に送信されたパヌティションに関連付けるこずができ、プロデュヌサヌ むンスタンス間で共有される状態の䞀郚を意味したす。

考慮すべきもう XNUMX ぀の芁玠は、パヌティション間でのメッセヌゞの均等な分散です。 通垞、キヌはメッセヌゞ党䜓に均等に分散されず、ハッシュ関数は少数のキヌのセットに察しおメッセヌゞが公平に分散されるこずを保蚌したせん。
どのようなメッセヌゞの分割を遞択しおも、区切り文字自䜓を再利甚する必芁がある堎合があるこずに泚意するこずが重芁です。

地理的に異なる堎所にある Kafka クラスタヌ間でデヌタをレプリケヌトする芁件を考慮しおください。 この目的のために、Kafka には MirrorMaker ず呌ばれるコマンド ラむン ツヌルが付属しおいたす。これは、あるクラスタヌからメッセヌゞを読み取り、別のクラスタヌに転送するために䜿甚されたす。

MirrorMaker は、クラスタヌ間でレプリケヌトするずきにメッセヌゞ間の盞察的な順序を維持するために、レプリケヌトされたトピックのキヌを理解する必芁がありたす。これは、そのトピックのパヌティションの数が XNUMX ぀のクラスタヌで同じではない可胜性があるためです。

デフォルトのハッシュたたはラりンド ロビンがほずんどのシナリオで適切に機胜するため、カスタム パヌティショニング戊略は比范的たれです。 ただし、匷力な順序付けの保蚌が必芁な堎合、たたはペむロヌドからメタデヌタを抜出する必芁がある堎合は、パヌティショニングを詳しく怜蚎する必芁がありたす。

Kafka のスケヌラビリティずパフォヌマンスの利点は、埓来のブロヌカヌの責任の䞀郚をクラむアントに移すこずによっおもたらされたす。 この堎合、䞊行しお動䜜する耇数のコンシュヌマ間で朜圚的に関連するメッセヌゞを配垃する決定が行われたす。

JMS ブロヌカヌもそのような芁件に察凊する必芁がありたす。 興味深いこずに、JMS メッセヌゞ グルヌプ (スティッキヌ ロヌド バランシング (SLB) 戊略のバリ゚ヌション) を通じお実装された、関連するメッセヌゞを同じコンシュヌマに送信するメカニズムでも、送信者がメッセヌゞを関連するものずしおマヌクする必芁がありたす。 JMS の堎合、ブロヌカヌは、この関連メッセヌゞのグルヌプを倚数のコンシュヌマヌの䞭から XNUMX ぀のコンシュヌマヌに送信し、コンシュヌマヌが萜ちた堎合にはグルヌプの所有暩を譲枡する責任がありたす。

プロデュヌサヌ契玄

メッセヌゞを送信するずきに考慮すべきこずはパヌティショニングだけではありたせん。 Java API のプロデュヌサヌ クラスの send() メ゜ッドを芋おみたしょう。

Future < RecordMetadata > send(ProducerRecord < K, V > record);
Future < RecordMetadata > send(ProducerRecord < K, V > record, Callback callback);

どちらのメ゜ッドも Future を返すこずに泚意しおください。これは、送信操䜜がすぐに実行されないこずを瀺したす。 その結果、メッセヌゞ (ProducerRecord) が各アクティブ パヌティションの送信バッファに曞き蟌たれ、Kafka クラむアント ラむブラリのバックグラりンド スレッドずしおブロヌカヌに送信されたす。 これにより凊理が驚くほど高速になりたすが、経隓の浅いアプリケヌションではプロセスが停止するずメッセヌゞが倱われる可胜性がありたす。

い぀ものように、パフォヌマンスを犠牲にしお送信操䜜の信頌性を高める方法がありたす。 このバッファのサむズは 0 に蚭定でき、次のように、送信アプリケヌション スレッドはブロヌカぞのメッセヌゞ転送が完了するたで埅機するようになりたす。

RecordMetadata metadata = producer.send(record).get();

メッセヌゞの読み取りに関する詳现

メッセヌゞの読み取りには、さらに耇雑な点があるため、掚枬する必芁がありたす。 メッセヌゞに応答しおメッセヌゞ リスナヌを実行できる JMS API ずは異なり、 消費財 Kafka はポヌリングのみを行いたす。 方法を詳しく芋おみたしょう ポヌリング()この目的のために䜿甚されたす:

ConsumerRecords < K, V > poll(long timeout);

メ゜ッドの戻り倀は、耇数のオブゞェクトを含むコンテナ構造です。 消費者蚘録 堎合によっおは耇数のパヌティションから。 消費者蚘録 それ自䜓は、掟生元のパヌティションなど、関連するメタデヌタを含むキヌず倀のペアのホルダヌ オブゞェクトです。

第 2 章で説明したように、クラむアントがメッセヌゞを凊理できない堎合やメッセヌゞが䞭止された堎合など、メッセヌゞの凊理が成功たたは倱敗した埌にどうなるかに留意する必芁がありたす。 JMS では、これは確認応答モヌドを通じお凊理されたした。 ブロヌカヌは、正垞に凊理されたメッセヌゞを削陀するか、生のメッセヌゞたたは停のメッセヌゞを再配信したす (トランザクションが䜿甚されたず仮定したす)。
Kafka の動䜜は倧きく異なりたす。 メッセヌゞは校正埌にブロヌカヌで削陀されたせん。倱敗した堎合に䜕が起こるかは校正コヌド自䜓の責任です。

すでに述べたように、コンシュヌマ グルヌプはログ内のオフセットに関連付けられおいたす。 このオフセットに関連付けられたログ䜍眮は、次のメッセヌゞに応答しお発行されるメッセヌゞに察応したす。 ポヌリング()。 このオフセットが増加する時点が読み取りの決定的になりたす。

前に説明した読み取りモデルに戻るず、メッセヌゞ凊理は XNUMX ぀の段階で構成されたす。

  1. 読むメッセヌゞを取埗したす。
  2. メッセヌゞを凊理したす。
  3. メッセヌゞを確認したす。

Kafka コンシュヌマヌには構成オプションが付属しおいたす 自動コミットを有効にする。 これは、「自動」ずいう単語を含む蚭定ず同様に、頻繁に䜿甚されるデフォルト蚭定です。

Kafka 0.10 より前では、このオプションを䜿甚するクラむアントは、次の呌び出しで読み取られた最埌のメッセヌゞのオフセットを送信しおいたした。 ポヌリング() 加工埌。 これは、クラむアントがすでにフェッチしたメッセヌゞを凊理しおいおも、呌び出す前に予期せず砎棄された堎合、それらのメッセヌゞを再凊理できるこずを意味したす。 ポヌリング()。 ブロヌカヌはメッセヌゞが読み取られた回数に関する状態を保持しないため、次にそのメッセヌゞを取埗するコンシュヌマヌは、䜕か悪いこずが起こったこずを知りたせん。 この動䜜は疑䌌トランザクションでした。 オフセットはメッセヌゞが正垞に凊理された堎合にのみコミットされたすが、クラむアントが䞭止された堎合、ブロヌカヌは同じメッセヌゞを別のクラむアントに再床送信したす。 この動䜜はメッセヌゞ配信の保蚌ず䞀臎しおいたした。少なくずも䞀床は"

Kafka 0.10 では、蚭定に埓っおクラむアント ラむブラリによっおコミットが定期的にトリガヌされるようにクラむアント コヌドが倉曎されたした。 auto.commit.interval.ms。 この動䜜は、JMS AUTO_ACKNOWLEDGE モヌドず DUPS_OK_ACKNOWLEDGE モヌドの間のどこかにありたす。 自動コミットを䜿甚するず、メッセヌゞが実際に凊理されたかどうかに関係なく、メッセヌゞがコミットされる可胜性がありたす。これは、遅いコンシュヌマヌの堎合に発生する可胜性がありたす。 コンシュヌマが䞭止された堎合、メッセヌゞは次のコンシュヌマによっおコミットされた䜍眮からフェッチされるため、メッセヌゞが倱われる可胜性がありたす。 この堎合、Kafka はメッセヌゞを倱ったのではなく、読み取りコヌドがメッセヌゞを凊理しなかっただけです。

このモヌドにはバヌゞョン 0.9 ず同じ玄束がありたす。぀たり、メッセヌゞは凊理できたすが、倱敗するずオフセットがコミットされず、配信が XNUMX 倍になる可胜性がありたす。 実行時に取埗するメッセヌゞが増えるほど ポヌリング()、この問題はさらに倧きくなりたす。

21 ペヌゞの「キュヌからのメッセヌゞの読み取り」で説明したように、障害モヌドを考慮するず、メッセヌゞング システムではメッセヌゞを XNUMX 回だけ配信するこずはできたせん。

Kafka では、オフセット (offset) をコミット (コミット) する方法は、自動ず手動の 0.9 ぀がありたす。 どちらの堎合も、メッセヌゞが凊理されたもののコミット前に倱敗した堎合、メッセヌゞは耇数回凊理される可胜性がありたす。 コミットがバックグラりンドで発生し、コヌドが凊理される前に完了しおしたった堎合 (おそらく Kafka XNUMX 以前の堎合)、メッセヌゞをたったく凊理しないこずも遞択できたす。

パラメヌタを蚭定するこずで、Kafka コンシュヌマ API で手動オフセット コミット プロセスを制埡できたす。 自動コミットを有効にする false に蚭定し、次のメ゜ッドのいずれかを明瀺的に呌び出したす。

void commitSync();
void commitAsync();

メッセヌゞを「少なくずも XNUMX 回」凊理したい堎合は、オフセットを手動でコミットする必芁がありたす。 commitSync()メッセヌゞを凊理した盎埌にこのコマンドを実行したす。

これらのメ゜ッドでは、メッセヌゞが凊理される前に確認応答するこずはできたせんが、トランザクションであるかのように芋せながら朜圚的な凊理遅延を排陀するこずはできたせん。 Kafka にはトランザクションはありたせん。 クラむアントには次のこずを行う機胜がありたせん。

  • 停のメッセヌゞを自動的にロヌルバックしたす。 メッセヌゞの再配信をブロヌカヌに䟝存できないため、コンシュヌマヌ自身が、問題のあるペむロヌドやバック゚ンドの停止によっお生じる䟋倖を凊理する必芁がありたす。
  • 98 ぀のアトミック操䜜で耇数のトピックにメッセヌゞを送信したす。 すぐに説明するように、さたざたなトピックやパヌティションに察する制埡は、送信時にトランザクションを調敎しない Kafka クラスタヌ内のさたざたなマシンに垞駐するこずができたす。 この蚘事の執筆時点では、KIP-XNUMX でこれを可胜にするためにいく぀かの䜜業が行われおいたす。
  • あるトピックからの XNUMX ぀のメッセヌゞの読み取りを、別のトピックぞの別のメッセヌゞの送信ず関連付けたす。 繰り返しになりたすが、Kafka のアヌキテクチャは XNUMX ぀のバスずしお実行される倚くの独立したマシンに䟝存しおおり、これを隠蔜する詊みは行われおいたせん。 たずえば、リンクを可胜にする API コンポヌネントはありたせん。 消費者 О プロデュヌサヌ トランザクション䞭。 JMS では、これはオブゞェクトによっお提䟛されたす。 セッションを開くそこから䜜成される メッセヌゞプロデュヌサヌ О メッセヌゞ消費者.

トランザクションに䟝存できない堎合、埓来のメッセヌゞング システムが提䟛するセマンティクスに近いセマンティクスを提䟛するにはどうすればよいでしょうか?

コンシュヌマのクラッシュ時など、メッセヌゞが凊理される前にコンシュヌマのオフセットが増加する可胜性がある堎合、コンシュヌマには、パヌティションが割り圓おられおいるずきにコンシュヌマ グルヌプがメッセヌゞを芋逃したかどうかを知る方法がありたせん。 したがっお、XNUMX ぀の戊略は、オフセットを前の䜍眮に巻き戻すこずです。 Kafka コンシュヌマヌ API は、このために次のメ゜ッドを提䟛したす。

void seek(TopicPartition partition, long offset);
void seekToBeginning(Collection < TopicPartition > partitions);

方法 求める メ゜ッドで䜿甚できたす
offsetsForTimes(地図怜玢するタむムスタンプ) 過去のある特定の時点の状態に巻き戻すこず。

このアプロヌチを䜿甚するず、暗黙的に、以前に凊理された䞀郚のメッセヌゞが再床読み取られお凊理される可胜性が非垞に高くなりたす。 これを回避するには、第 4 章で説明したように、冪等読み取りを䜿甚しお、以前に衚瀺したメッセヌゞを远跡し、重耇を排陀したす。

あるいは、メッセヌゞの損倱や重耇が蚱容される限り、コンシュヌマヌ コヌドを単玔にするこずもできたす。 ログむベント、メトリクス、クリック远跡などの凊理など、Kafka が䞀般的に䜿甚されるナヌスケヌスを芋るず、個々のメッセヌゞの損倱が呚囲のアプリケヌションに倧きな圱響を䞎える可胜性は䜎いこずがわかりたす。 このような堎合は、デフォルト倀をそのたた䜿甚できたす。 䞀方、アプリケヌションで支払いを送信する必芁がある堎合は、個々のメッセヌゞを泚意深く凊理する必芁がありたす。 すべおはコンテキストに䟝存したす。

個人的な芳察によるず、メッセヌゞの匷床が増すに぀れお、個々のメッセヌゞの䟡倀は枛少したす。 倧きなメッセヌゞは、集玄された圢匏で衚瀺するず䟡倀がある傟向がありたす。

高可甚性

高可甚性に察する Kafka のアプロヌチは、ActiveMQ のアプロヌチずは倧きく異なりたす。 Kafka は、すべおのブロヌカヌ むンスタンスが同時にメッセヌゞを受信および配垃するスケヌルアりト クラスタヌを䞭心に蚭蚈されおいたす。

Kafka クラスタヌは、異なるサヌバヌ䞊で実行される耇数のブロヌカヌ むンスタンスで構成されたす。 Kafka は、各ノヌドが独自の専甚ストレヌゞを持぀通垞のスタンドアロン ハヌドりェア䞊で実行されるように蚭蚈されおいたす。 耇数の蚈算ノヌドが時間を競う可胜性があるため、ネットワヌク接続ストレヌゞ (SAN) の䜿甚は掚奚されたせん。Ы保管間隔が長くなり、競合が発生したす。

カフカは 垞にオン システム。 倚くの倧芏暡な Kafka ナヌザヌはクラスタヌをシャットダりンするこずはなく、゜フトりェアは垞に順次再起動しお曎新されたす。 これは、メッセヌゞおよびブロヌカヌ間の察話に぀いお、以前のバヌゞョンずの互換性を保蚌するこずによっお実珟されたす。

サヌバヌクラスタヌに接続されたブロヌカヌ 飌育係、構成デヌタ レゞストリずしお機胜し、各ブロヌカヌの圹割を調敎するために䜿甚されたす。 ZooKeeper 自䜓は分散システムであり、次のような情報の耇補を通じお高可甚性を提䟛したす。 定足数.

基本的なケヌスでは、次のプロパティを持぀トピックが Kafka クラスタヌ内に䜜成されたす。

  • パヌティションの数。 前に説明したように、ここで䜿甚される正確な倀は、䞊列読み取りの必芁なレベルによっお異なりたす。
  • レプリケヌション係数 (係数) は、クラスタヌ内のブロヌカヌ むンスタンスの数がこのパヌティションのログを含む必芁があるかを決定したす。

ZooKeeper を調敎に䜿甚しお、Kafka はクラスタヌ内のブロヌカヌ間で新しいパヌティションを公平に分散しようずしたす。 これは、コントロヌラヌずしお機胜する単䞀のむンスタンスによっお実行されたす。

実行時 トピックパヌティションごずに コントロヌラヌ ブロヌカヌに圹割を割り圓おる リヌダヌ (リヌダヌ、マスタヌ、プレれンタヌ) フォロワヌ 埓者、奎隷、郚䞋。 このパヌティションのリヌダヌずしお機胜するブロヌカヌは、プロデュヌサから送信されたすべおのメッセヌゞを受信し、そのメッセヌゞをコンシュヌマに配垃する責任がありたす。 メッセヌゞがトピック パヌティションに送信されるず、そのパヌティションのフォロワヌずしお機胜するすべおのブロヌカヌ ノヌドにメッセヌゞが耇補されたす。 パヌティションのログを含む各ノヌドは次のように呌ばれたす。 レプリカ。 ブロヌカヌは、䞀郚のパヌティションではリヌダヌずしお機胜し、他のパヌティションではフォロワヌずしお機胜したす。

リヌダヌが保持するすべおのメッセヌゞを含むフォロワヌが呌び出されたす。 同期されたレプリカ (同期状態にあるレプリカ、同期レプリカ)。 パヌティションのリヌダヌずしお機胜するブロヌカヌがダりンした堎合、そのパヌティションに察しお最新の状態たたは同期されおいるブロヌカヌがリヌダヌの圹割を匕き継ぐこずができたす。 信じられないほど持続可胜なデザむンです。

プロデュヌサヌ蚭定の䞀郚はパラメヌタです。 ACKこれにより、アプリケヌション スレッドが送信を続行する前にメッセヌゞの受信を確認 (承認) する必芁があるレプリカの数が決たりたす (0、1、たたはすべお)。 に蚭定されおいる堎合 をメッセヌゞを受信するず、リヌダヌは、トピック蚭定で定矩された耇数のキュヌ (それ自䜓を含む) からレコヌドの確認 (肯定応答) を受信するずすぐに、プロデュヌサヌに確認を送り返したす。 min.insync.レプリカ (デフォルトは 1)。 メッセヌゞを正垞に耇補できない堎合、プロデュヌサはアプリケヌション䟋倖をスロヌしたす (レプリカが足りない たたは 远加埌のレプリカが䞍足しおいたす).

䞀般的な構成では、レプリケヌション係数 3 (パヌティションごずに 1 ぀のリヌダヌ、2 ぀のフォロワヌ) ずパラメヌタヌを䜿甚しおトピックが䜜成されたす。 min.insync.レプリカ この堎合、クラスタヌは、クラむアント アプリケヌションに圱響を䞎えるこずなく、トピック パヌティションを管理しおいるブロヌカヌの 2 ぀がダりンするこずを蚱可したす。

これは、パフォヌマンスず信頌性の間のすでにおなじみのトレヌドオフに戻りたす。 レプリケヌションは、フォロワヌからの確認 (確認応答) を埅機する远加の時間を犠牲にしお発生したす。 ただし、䞊列実行されるため、少なくずも XNUMX ぀のノヌドぞのレプリケヌションは XNUMX ぀のノヌドず同じパフォヌマンスになりたす (ネットワヌク垯域幅の䜿甚量の増加を無芖したす)。

このレプリケヌション スキヌムを䜿甚するこずにより、Kafka は、次の操䜜で各メッセヌゞを物理的にディスクに曞き蟌む必芁性を巧みに回避したす。 同期()。 プロデュヌサによっお送信された各メッセヌゞはパヌティション ログに曞き蟌たれたすが、第 2 章で説明したように、ファむルぞの曞き蟌みは最初はオペレヌティング システムのバッファ内で行われたす。 このメッセヌゞが別の Kafka むンスタンスにレプリケヌトされ、そのメモリ内にある堎合、リヌダヌの喪倱はメッセヌゞ自䜓が倱われたこずを意味するものではなく、同期されたレプリカによっお匕き継がれる可胜性がありたす。
手術の拒吊 同期() ぀たり、Kafka はメッセヌゞをメモリに曞き蟌むのず同じ速さでメッセヌゞを受信できたす。 逆に、メモリをディスクにフラッシュするこずを避けるこずができる時間が長ければ長いほど、より良いこずになりたす。 このため、Kafka ブロヌカヌに 64 GB 以䞊のメモリが割り圓おられるこずも珍しくありたせん。 このメモリ䜿甚量は、単䞀の Kafka むンスタンスが埓来のメッセヌゞ ブロヌカヌの数千倍の速床で簡単に実行できるこずを意味したす。

Kafka は操䜜を適甚するように構成するこずもできたす 同期() メッセヌゞパッケヌゞに。 Kafka のすべおはパッケヌゞ指向であるため、実際には倚くのナヌスケヌスで非垞にうたく機胜し、非垞に匷力な保蚌を必芁ずするナヌザヌにずっお䟿利なツヌルです。 Kafka の玔粋なパフォヌマンスの倚くは、パケットずしおブロヌカヌに送信されるメッセヌゞから埗られ、これらのメッセヌゞは、次のコマンドを䜿甚しお連続ブロックでブロヌカヌから読み取られたす。 れロコピヌ 操䜜 (あるメモリ領域から別のメモリ領域にデヌタをコピヌするタスクが実行されない操䜜)。 埌者はパフォヌマンスずリ゜ヌスを倧幅に向䞊させたすが、これはパヌティション スキヌムを定矩する基瀎ずなるログ デヌタ構造を䜿甚するこずによっおのみ可胜になりたす。

トピック パヌティションは倚くの個別のマシンにスケヌルアりトできるため、Kafka クラスタヌでは単䞀の Kafka ブロヌカヌを䜿甚するよりもはるかに優れたパフォヌマンスが可胜です。

結果

この章では、Kafka アヌキテクチャがクラむアントずブロヌカヌ間の関係をどのように再考しお、埓来のメッセヌゞ ブロヌカヌの䜕倍ものスルヌプットを備えた非垞に堅牢なメッセヌゞング パむプラむンを提䟛する方法に぀いお説明したした。 これを実珟するために䜿甚される機胜に぀いお説明し、この機胜を提䟛するアプリケヌションのアヌキテクチャに぀いお簡単に説明したした。 次の章では、メッセヌゞング ベヌスのアプリケヌションが解決する必芁がある䞀般的な問題を芋お、それらに察凊する戊略に぀いお説明したす。 この章の最埌では、メッセヌゞング テクノロゞ䞀般に぀いお説明する方法を抂説しお、ナヌス ケヌスに察するメッセヌゞング テクノロゞの適合性を評䟡できるようにしたす。

以前に翻蚳された郚分: メッセヌゞブロヌカヌを理解する。 ActiveMQ ず Kafka を䜿甚したメッセヌゞングの仕組みを孊習したす。 第1ç« 

翻蚳完了: tele.gg/middle_java

継続するには...

登録ナヌザヌのみがアンケヌトに参加できたす。 ログむンお願いしたす。

あなたの組織では Kafka が䜿甚されおいたすか?

  • はい

  • ノヌ

  • 以前は䜿甚されおいたしたが、珟圚は䜿甚されおいたせん

  • 䜿甚する予定です

38 人のナヌザヌが投祚したした。 8名のナヌザヌが棄暩した。

出所 habr.com

コメントを远加したす