Kafka トピック分割戦略の解読: リアルタイムデータ処理の改善の鍵

Kafka トピック分割戦略の解読: リアルタイムデータ処理の改善の鍵

Kafka は、今日の時代におけるデータ パイプラインのほぼ第一選択肢です。バックエンド開発やビッグデータ開発を行っている方なら、ご存知かもしれません。オープンソースソフトウェア Kafka の応用はますます広まっています。

Kafka の人気と学習ブームを受けて、Nezha は長年の開発経験を共有し、読者が Kafka の関連知識をより簡単に習得できるようにしたいと考えています。

今日は、 Kafka のパーティショニング戦略について体系的に説明します。これにより、Kafka を段階的に破壊し、1 つずつ打ち負かすことができるようになります。

1. Kafkaトピック分割戦略の概要

Kafka トピックのパーティショニング戦略を理解することは、高性能なメッセージング システムを構築する上で非常に重要です。 Kafka パーティショニング戦略の重要性と、それを分散メッセージングで使用する方法について詳しく説明します。

1. Kafka トピックのパーティション分割戦略は何ですか?

Kafka は、高スループットのデータ ストリーミングを実現する分散メッセージング システムです。メッセージング システムの中核はトピックであり、複数のパーティションを含めることができます。

パーティションは Kafka における並列処理の基本単位であり、データの同時処理を可能にします。

パーティション戦略は、トピック内の異なるパーティションにメッセージをどのように分散するかを定義します。メッセージがどのパーティションに書き込まれるか、また消費時に異なるパーティションからメッセージがどのように読み取られるかを決定します。

パーティショニング戦略は Kafka の重要なコンポーネントであり、Kafka クラスターのパフォーマンスとデータの順序に直接影響します。

2. パーティショニング戦略が重要なのはなぜですか?

パーティショニング戦略の選択は、Kafka システムのパフォーマンス、スケーラビリティ、フォールト トレランスに大きな影響を与えます。

パーティション分割戦略に影響を与える主な要因は次のとおりです。

  • スループット: 適切なパーティショニング戦略により、Kafka クラスターのスループットを向上させることができます。メッセージを並列処理できるため、データ配信の効率が向上します。
  • 負荷分散: パーティション分割戦略は、Kafka クラスター内のパーティション間で負荷を分散するのに役立ちます。バランスの取れたパーティション分散とは、過負荷のパーティションが存在しないことを意味します。これにより、システムの安定性が向上します。
  • 秩序性: 一部のアプリケーションではメッセージの順序を維持する必要があるため、メッセージの順序を維持するには適切なパーティション分割戦略を選択することが重要です。
  • フォールト トレランス: 適切なパーティショニング戦略により、システムへの障害の影響を軽減できます。パーティショニング戦略により、ノード障害が発生した場合でも信頼性の高いメッセージ配信が保証されます。

2. Kafka のデフォルトのパーティショニング戦略

1. ラウンドロビンパーティショニング戦略

Kafka のデフォルトのパーティション分割戦略はラウンドロビンです。つまり、プロデューサーがトピックにメッセージを送信すると、Kafka ラウンドロビンはメッセージが均等に分散されるように各パーティションを選択します。

ラウンドロビン戦略は次のように機能します。

  • プロデューサーがトピックにメッセージを送信する場合、ターゲット パーティションは指定されません。
  • Kafka ブローカーは、ラウンドロビン アルゴリズムに基づいて、次に使用可能なパーティションを選択します。
  • メッセージは選択したパーティションに追加されます。

この戦略は次の状況に適用されます。

  • ラウンドロビンは、メッセージ キーに特定の意味や目的がない場合に使用できるシンプルなパーティション分割戦略です。
  • これは、パーティション間でメッセージを均等に分散する場合に効果的な戦略です。

このコード例は、ラウンドロビン パーティション分割戦略を使用する Kafka プロデューサーを作成する方法を示しています。コードの詳細な説明は次のとおりです。

必要なライブラリをインポートします。

 import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord;

Kafka プロデューサーの構成プロパティを設定します。

 Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  • "bootstrap.servers": これらは、プロデューサーが接続する Kafka ブローカーのアドレスです。
  • "key.serializer": メッセージ キーをシリアル化するために使用されるシリアライザー。
  • "value.serializer": メッセージの値をシリアル化するために使用されるシリアライザー。

Kafka プロデューサーを作成します。

 Producer<String, String> producer = new KafkaProducer<>(props);

プロデューサーを使用してトピック (「my-topic」) にメッセージを送信します。次の 2 つのメッセージがあります。

 producer.send(new ProducerRecord<>("my-topic", "key1", "value1")); producer.send(new ProducerRecord<>("my-topic", "key2", "value2")); // ...

ProducerRecord は、送信するメッセージのトピック、キー、および値を指定するために使用されます。

最後に、使用が終わったらプロデューサーを閉じることを忘れないでください。

 producer.close();

このコードは、ラウンドロビン パーティショニング戦略を使用して「my-topic」というトピックにメッセージを送信する Kafka プロデューサーを作成します。これは、特定のパーティション分割戦略を必要とせず、パーティション間でメッセージを均等に分散するだけの場合によく使用される、シンプルですが一般的な使用例です。

3. カスタムパーティション戦略

1. カスタムパーティショナーを作成する

場合によっては、Kafka のデフォルトのラウンドロビン戦略が特定のニーズを満たさないことがあります。この場合、カスタム パーティション分割戦略を記述できます。カスタム パーティション分割戦略を使用すると、メッセージ キーに基づいてパーティションを選択できるため、柔軟性が向上します。

カスタム パーティショナーを作成するには、org.apache.kafka.clients.producer.Partitioner インターフェースを実装し、次のメソッドを実装する必要があります。

  • int パーティション(String topic、Object key、byte[] keyBytes、Object value、byte[] valueBytes、Cluster cluster): このメソッドは、メッセージのキーに基づいてパーティションを選択し、パーティションのインデックスを返します。
  • void close(): パーティショナーが閉じられるときに実行されるクリーンアップ操作。
  • void configure(Map<String, ?> configs): パーティショナーを構成します。

以下は、カスタム パーティショナー Java クラスの記述方法を示す例です。

 // 代码示例:自定义分区器的Java类public class CustomPartitioner implements Partitioner { @Override public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); int numPartitions = partitions.size(); // 根据消息的键来选择分区int partition = Math.abs(key.hashCode()) % numPartitions; return partition; } @Override public void close() { // 关闭资源} @Override public void configure(Map<String, ?> configs) { // 配置信息} }

2. ベストプラクティス: パーティション分割戦略の選択方法

適切なパーティション分割戦略を選択することは重要であり、Kafka アプリケーションのパフォーマンスと動作に直接影響します。

最も適切なパーティション分割戦略を選択するのに役立ついくつかの提案を次に示します。

  • メッセージの意味を考慮する: メッセージのキーに地理的な場所やユーザー ID などの特定の意味がある場合は、カスタム パーティション分割戦略を使用して、関連するメッセージが同じパーティションに書き込まれるようにし、データの局所性を維持することができます。
  • パフォーマンス テストと評価: パーティション分割戦略を選択する前に、パフォーマンス テストと評価を実行することが重要です。戦略が異なればパフォーマンスへの影響も異なります。
  • 負荷分散: パーティショニング戦略によって、Kafka クラスター内の各ノードに負荷が均等に分散されることを確認します。避ける

過負荷のパーティションはシステムの安定性を維持するようです。

プロデューサー構成で使用するパーティショナーを次のように指定できます。

 // 代码示例:如何在生产者中指定自定义分区器props.put("partitioner.class", "com.example.CustomPartitioner");

4. パーティショニング戦略のパフォーマンスに関する考慮事項

1. データバランス

Kafka では、データのバランスがパーティション分割戦略の重要な要素となります。パーティションのバランスが取れていない場合、一部のパーティションが他のパーティションよりも多くのデータを処理し、負荷が不均一になる可能性があります。

不均等な負荷を回避するために、各パーティションがほぼ同量のデータを処理するようにする方法。

実際の状況では、メッセージのキーの配布が不均一なためにデータバランスの問題が発生する可能性があります。

この問題を解決するには、次のアプローチを検討できます。

  • カスタム パーティション戦略: メッセージのキーに基づいてパーティションを選択し、関連するメッセージが同じパーティションに書き込まれるようにします。これにより、データの局所性が維持され、パーティションの不均衡が軽減されます。
  • パーティションの再割り当て: パーティションのデータ量を定期的に確認します。不均衡が見つかった場合は、パーティションの再割り当てを検討してください。これは手動で行うこともできますし、ツールを利用して自動化することもできます。

2. 高いスループット

高いスループットは、Kafka クラスターの重要なパフォーマンス指標です。パーティショニング戦略は Kafka クラスターのスループットにどのような影響を与えますか?同時に、スループットのボトルネックの詳細な分析やパフォーマンスのチューニングなど、パフォーマンスの最適化のための戦略も提供します。

高いスループットを実現するには、パフォーマンス最適化の次の側面を考慮することができます。

  • プロデューサー設定を調整する: batch.size や linger.ms などのプロデューサー構成パラメータを調整することで、より高いスループットを実現できます。これらのパラメータはメッセージのバッチ処理とレイテンシに影響し、スループットに影響します。
 // 代码示例:如何调整生产者的批量发送设置以提高吞吐量props.put("batch.size", 16384); props.put("linger.ms", 1);
  • 水平拡張: Kafka クラスターのスループット需要が非常に高い場合は、Kafka ブローカー ノードを追加して水平拡張を検討できます。これにより、クラスターの全体的なスループットが向上します。
  • 監視と調整: Kafka クラスターのパフォーマンスを定期的に監視し、必要に応じて調整を行います。監視ツールを使用して、負荷の高いパーティションなどのパフォーマンスのボトルネックを検出し、解決するための手順を実行します。

3. 連続性

Kafka は、メッセージの順序付けが優れていることでよく知られています。ただし、パーティション分割戦略はメッセージの順序に影響を与える可能性があります。パーティション戦略がメッセージの順序にどのように影響するか、また、メッセージの順序を維持するために同じキーを持つメッセージが同じパーティションに書き込まれるようにする方法を説明します。

一部のアプリケーションでは、メッセージを順序よく保つことが重要です。メッセージが複数のパーティションに書き込まれる場合、異なる順序で消費される可能性があります。秩序を保つために、次の方法を検討できます。

  • カスタム パーティション戦略: カスタム パーティション戦略を使用して、メッセージのキーに基づいてパーティションを選択します。これにより、同じキーを持つメッセージが同じパーティションに書き込まれ、メッセージの順序が維持されます。
  • 単一パーティション トピック: 厳密な順序を維持する必要があるデータの場合は、単一パーティション トピックに書き込むことを検討してください。この方法では、どのようなパーティション戦略を使用しても、メッセージはすべて同じパーティションに格納されます。
  • メッセージ シーケンスを監視する: メッセージのシーケンスを定期的に監視して、異常がないことを確認します。 Kafka が提供するツールを使用して、パーティションの分散とメッセージの順序を確認します。

これらの戦略は、高いスループットでメッセージの順序を維持し、データの正確性と一貫性を保証するのに役立ちます。

上記の内容では、データのバランス、高スループット、連続性など、パーティション戦略のパフォーマンスに関する考慮事項について詳しく説明します。これらのパフォーマンス要因を理解することは、Kafka アプリケーションを設計および最適化する上で重要です。この情報がお役に立てば幸いです。

5. 例: 異なるパーティション分割戦略の使用

このセクションでは、例を使用して、特定のニーズを満たすためにさまざまなパーティション分割戦略を使用する方法を説明します。

各戦略の適用と影響をより深く理解するために、サンプル コード、入力データ、出力データ、パフォーマンス テスト結果を提供します。

1. 例1: ラウンドロビン戦略

背景:

ログ記録システムを構築していて、さらなる処理のためにさまざまなログ メッセージを Kafka に送信する必要があるとします。この場合、すべてのログ メッセージの重要性は同じなので、メッセージのパーティション分割についてはあまり気にする必要はありません。これは、ラウンドロビン戦略が役立つシナリオです。

例:

 // 代码示例:创建一个使用Round-Robin策略的Kafka生产者Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); // 发送日志消息,分区策略为Round-Robin producer.send(new ProducerRecord<>("logs-topic", "log-message-1")); producer.send(new ProducerRecord<>("logs-topic", "log-message-2")); producer.send(new ProducerRecord<>("logs-topic", "log-message-3")); producer.close();

出力:

  • ログメッセージ1はパーティション1に書き込まれます
  • ログメッセージ2はパーティション2に書き込まれます
  • ログメッセージ3はパーティション3に書き込まれます

パフォーマンステスト:

ラウンドロビン戦略では、メッセージがさまざまなパーティションに均等に分散されるため、通常は優れたスループットが得られます。

この例では、スループットは Kafka クラスターのパフォーマンスとプロデューサーの構成によって異なります。

2. 例2: カスタムパーティション戦略

背景:

ここで、電子商取引プラットフォームを構築していて、ユーザーが生成した注文メッセージを処理のために Kafka に送信する必要があるとします。この場合、注文メッセージのキー情報は注文 ID です。注文メッセージの順序を維持するために、同じ注文 ID を持つメッセージを同じパーティションに書き込む必要があります。

例:

 // 代码示例:创建一个使用自定义分区策略的Kafka生产者Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("partitioner.class", "com.example.OrderPartitioner"); Producer<String, String> producer = new KafkaProducer<>(props); // 发送订单消息,使用自定义分区策略producer.send(new ProducerRecord<>("orders-topic", "order-123", "order-message-1")); producer.send(new ProducerRecord<>("orders-topic", "order-456", "order-message-2")); producer.send(new ProducerRecord<>("orders-topic", "order-123", "order-message-3")); producer.close();

出力:

  • 注文メッセージ1はパーティション2に書き込まれます
  • 注文メッセージ2はパーティション1に書き込まれます
  • 注文メッセージ3はパーティション2に書き込まれます

パフォーマンステスト:

通常、カスタム パーティション分割戦略は、メッセージ間の順序を維持するのに効果的です。スループットは依然として Kafka クラスターのパフォーマンスとプロデューサーの構成に依存しますが、この例ではメッセージの順序を維持することに重点が置かれています。

これら 2 つの例は、さまざまなパーティション分割戦略の適用とパフォーマンスを示しています。特定のニーズに基づいて、ビジネス要件を満たす適切なパーティション分割戦略を選択できます。

上記では、ラウンドロビン戦略とカスタム パーティション戦略の実際の適用を含む例を詳細に説明しました。サンプル コードとパフォーマンス テストの結果は、これらの戦略がどのように使用されるかをよりよく理解するのに役立ちます。

VI.結論

この記事では、Kafka メッセージング システムのコア コンポーネントである Kafka トピックのパーティション分割戦略について詳しく説明しました。私たちは基礎から始め、パーティショニング戦略の基本的な概念、それがなぜ重要なのか、そしてそれが Kafka クラスターのパフォーマンスとデータの順序にどのように影響するかを理解しました。

まず、メッセージを各パーティションに均等に分散する、Kafka のデフォルトのパーティション分割戦略であるラウンドロビン戦略を紹介します。

例を通じて、ラウンドロビン戦略のアプリケーション シナリオとパフォーマンス特性を示し、カスタム パーティション戦略の作成方法について詳しく説明しました。特定の要件を満たすためにメッセージ キーに基づいてパーティションを選択する方法を示すサンプル コードを提供します。

また、適切なパーティション分割戦略を選択し、パフォーマンスのテストと評価を実施するためのアドバイスもいくつか紹介します。パーティショニング戦略のパフォーマンスの考慮事項では、データのバランス、高スループット、連続性などの重要な要素について説明します。パーティション分割戦略のパフォーマンスを最適化するために役立つパフォーマンス最適化戦略とサンプル コードを提供します。

<<:  Kubernetes RBAC 101: ヘルパーコマンドを使用してセキュリティ制御を強化する方法

>>:  IBMとVMware、WatsonX On-Premisesによる生成AIのエンタープライズ展開をサポート

推薦する

国産CPUをベースにしたクラウドプラットフォーム上でコンテナ管理プラットフォームを構築するには? (パート2)

「ZTE事件」が拡大し続ける中、中国国民は自主管理可能な国産技術に大きな注目を寄せている。私の部署の...

ラジオ2023、未来はすぐそこ

VMware が設立されてから 25 年が経ち、イノベーションは VMware の代名詞となりました...

ウェブサイトの最適化中にコンテンツの問題を解決する方法

ウェブサイトを構築したい場合、ウェブサイトのコンテンツなしでは成り立ちません。実際、SEO技術がどれ...

arkecxのフィリピンサーバー、マニラデータセンター/デフォルトの1Gbps帯域幅の簡単なレビュー

arkecxはどうですか? arkecxのフィリピンサーバーはどうですか?現在、フィリピンでデータセ...

Baidu スナップショットをタイムリーに更新するために注意すべき 4 つの側面

以前作成したいくつかのサイトは、すべてランキングが良好でした。ホームページの一部は途中で何度も Ba...

adroitssd: $6.47/KVM/1g メモリ/20g SSD/1T トラフィック/Phoenix

adroitssd は、2001 年からホスティング サービスを提供していると主張しています。200...

さまざまなエッジ クラスタ管理ソリューションの比較と選択

[[429682]]この記事は、Double_Dong&Huazi が執筆した WeChat...

6万点の商品が10%オフで販売され、タオバオの売り手は280万ドルの巨額損失を被る可能性

商人は慈悲を乞うた。「おや!価格が間違っています。注文をキャンセルしてください。」ネットユーザーから...

よくある SEO の問題と解決策

SEO を行う際に、誰もがさまざまな問題に遭遇することは避けられません。これは実は良いことです。問題...

シングルページウェブサイトのコンテンツが少ない理由とそれに対応する戦略の簡単な分析

現在、多くの利益を上げているウェブサイトは、シングルページウェブサイトの運営戦略を採用しています。こ...

ハイブリッドクラウドは長い間人気があったが、今では単なるクラウドになってしまった。

[[395299]]デジタル中国の構築は第14次5カ年計画の重要な方向性となっている。デジタル工業化...

入札ウェブサイトがますます増える中、ウェブマスターは何をすべきでしょうか?

数年前、多くのウェブマスターは入札について何も知りませんでした。しかし、今はどうでしょうか?大小さま...

エンタープライズWebサイト構築システムMetInfo V6.1.0の新機能の紹介

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますV6.0....

ウェブサイトデータの3つのコア要素の簡単な分析

ウェブサイトがコンテンツを更新し、外部リンク システムを構築する適切な方法を確立したら、ウェブマスタ...