Apache Kafkaは、ストリーミングデータのリアルタイム入力と処理用に設計された分散データストレージです。 ストリーミングデータは、何千ものデータソースによって継続的に生成される情報であり、そのすべてが同時にデータレコードを送信します。 ストリーミングプラットフォームは、絶え間ないデータの流入に対処し、データを順次かつ段階的に処理できる必要があります。
マルチスレッドとは何ですか?なぜそれが必要なのですか?
中央処理装置(CPU)(またはマルチコアプロセッサのシングルコア)が、オペレーティングシステムでサポートされている、多数の実行スレッドを同時に提供する機能は、マルチスレッドと呼ばれます。 マルチスレッドを使用すると、データの一貫性を損なうことなく並行して動作できる小さなユニットに作業を分割できる場合に、アプリケーションの速度を向上させることができます。 Kafkaを使用すると、トピック内のメッセージのサブセットとして順序付けられたパーティションを使用して、分散システムを拡張できます。
最近、開発者が、計算で単一のパーティションからのデータを効率的に処理できるようにするのではなく、パーティション/仮想マシンを拡張して必要なスループットを得るという簡単なルートをとる傾向に気づきました。 それは問題にお金を投げるのと同じです。
Kafkaのトピックは、レコードをパーティションと呼ばれる小さな部分に分割します。パーティションは、結果の精度を損なうことなく個別に処理でき、並列処理の基礎を築きます。 これは通常、スケーリングによって実現されます。スケーリングでは、同じグループ内の多くのコンシューマーを使用し、各コンシューマーがトピックパーティションのサブセットからのデータを処理し、単一のスレッドで動作します。
ほとんどの場合、単一のスレッドでメッセージを読み取って処理するだけで十分だからです Kafkaのユースケース、Apache カフカの消費者 スレッド化パラダイムは広く利用されています。 処理にI/Oアクティビティが必要ない場合、ポーリングループはスムーズに機能します。
カフカの消費者
Kafkaを購入する消費者は通常、グループの一員として購入します。 多くのコンシューマーがトピックをサブスクライブし、同じコンシューマーグループのメンバーである場合、各コンシューマーはサブジェクトのパーティションのサブセットからメッセージを受信します。
コンシューマーグループにコンシューマーを追加することは、Kafkaトピックからのデータ消費をスケーリングするための最も一般的な手法です。 Kafkaのコンシューマーは、データベースへの書き込みやデータの時間のかかる計算の実行など、待ち時間の長いアクションを頻繁に実行します。 単一のコンシューマーがトピックにデータが流入する速度に追いつかない場合は、各コンシューマーにパーティションとメッセージのサブセットのみを所有させることで、負荷を共有するコンシューマーを追加することでスケーリングします。
マルチスレッドの利点
マルチスレッドを使用すると、プログラムの多くの部分を同時に実行できます。 スレッドは、プロセス内で使用できる軽量プロセスです。 マルチスレッドにより、マルチタスクでCPUを最大限に活用できます。
マルチスレッドプログラミングの利点のいくつかを次に示します。
リソースの共有
メモリ、データ、ファイルなどのプロセスのリソースは、すべてのスレッド間で共有されます。 リソース共有を使用すると、1つのプログラムで同じアドレス空間に複数のスレッドを含めることができます。
応答性
プログラムの応答性により、マルチスレッドによってプログラムの一部が停止した場合でも、プログラムは動作し続けることができます。 プロセスが長時間の操作を実行している場合は、これも実行できます。
マルチプロセッサアーキテクチャ
マルチスレッドを使用すると、マルチプロセッサアーキテクチャの各スレッドを異なるプロセッサで並列に実行できます。 これにより、システムの同時実行性が向上します。 シングルプロセッサシステムでは、一度に1つのプロセスまたはスレッドのみを実行できます。
コンシューマーモデルごとのスレッドとは
各スレッドはインスタンス化され、コンシューマーモデルごとのスレッドでKafkaブローカーに接続されます。 これらのスレッドにメッセージが送信されるパーティションは、kafkaブローカーによって割り当てられます。
シングルスレッドはマルチスレッドコンシューマーモードでKafkaに接続し、複数の/シングルパーティションからデータを取得できます。 データがスレッドに提供されると、スレッドはメッセージを他のスレッドのプールに配布して、並行して処理することができます。 このメソッドでは、コンシューマスレッドが、どの子スレッドがどのタイプのメッセージを処理するかを決定します。 ただし、この場合、オフセット管理は非常に困難になります。
Springは、Kafkaに接続するための複数のスレッドを簡単に生成する可能性があります。 2つの動作がどのように異なるかを見てみましょう。 10個のパーティションと単一のVMが単一の同時Springアプリケーションを実行する単一のテストトピックがあります。
コンシューマーモデルごとのスレッド
/**
* Consumer configuration for email topics
*
* @return
*/
@Bean
public ConsumerFactory<String, String> consumerFactory()
{
Map<String, Object> props = new HashMap<>();
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, EMAIL_STATUS_CONSUMER_GROUP);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(props);
}
/ **
*kafkaリスナーの同時実行性を設定します
*
* @戻る
* /
@豆
public ConcurrentKafkaListenerContainerFactory
{{
ConcurrentKafkaListenerContainerFactory
factory.setConsumerFactory(consumerFactory());
factory.setConcurrency(1);
工場を返す;
}
この部門は、消費者グループの春のグループによって耳を傾けられています。 以下は、単一の並行性がどのように動作するかです。
グループトピックパーティションコンシューマーIDホストクライアントID
春グループテスト-トピック8コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック2コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック1コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック4コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック5コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック6コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック3コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック7コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
春グループテスト-トピック9コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
スプリンググループテスト-トピック0コンシューマー-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1/172.22.0.1コンシューマー-1
上記の出力をよく見ると、アプリケーションのコンシューマーIDが10個のパーティションすべてで同じであることがわかります。これは、それらすべてを接続する単一のスレッドであることを示しています。
並行性が2に増加するとどうなるかを見てみましょう。
グループトピックパーティションコンシューマーIDホストクライアントID
春グループテスト-トピック8コンシューマー-2-8ab0213d-683c-4f92-b3c8-767701905994/172.22.0.1コンシューマー-2
春グループテスト-トピック5コンシューマー-2-8ab0213d-683c-4f92-b3c8-767701905994/172.22.0.1コンシューマー-2
春グループテスト-トピック6コンシューマー-2-8ab0213d-683c-4f92-b3c8-767701905994/172.22.0.1コンシューマー-2
春グループテスト-トピック7コンシューマー-2-8ab0213d-683c-4f92-b3c8-767701905994/172.22.0.1コンシューマー-2
春グループテスト-トピック9コンシューマー-2-8ab0213d-683c-4f92-b3c8-767701905994/172.22.0.1コンシューマー-2
春グループテスト-トピック4コンシューマー-1-886f1a6e-f316-4e17-90d2-599a582682e4/172.22.0.1コンシューマー-1
スプリンググループテスト-トピック2コンシューマー-1-886f1a6e-f316-4e17-90d2-599a582682e4/172.22.0.1コンシューマー-1
春グループテスト-トピック3コンシューマー-1-886f1a6e-f316-4e17-90d2-599a582682e4/172.22.0.1コンシューマー-1
スプリンググループテスト-トピック1コンシューマー-1-886f1a6e-f316-4e17-90d2-599a582682e4/172.22.0.1コンシューマー-1
スプリンググループテスト-トピック0コンシューマー-1-886f1a6e-f316-4e17-90d2-599a582682e4/172.22.0.1コンシューマー-1
上のスクリーンショットでわかるように、2つのスレッドがあり、それぞれに5つのパーティションがあります。
Kafkaは、同じコンシューマーグループに属するスレッド間でパーティションを均等に分散しようとします。 10個の同時スレッドを作成すると、パーティションごとに専用のスレッドが作成されます。
結論
この記事では、マルチスレッドに関するいくつかのことを理解し、スレッドモデルについて学びます。








