Apache Kafka シリーズ ~ Producer の内部~

kafka

皆さんこんにちは!今回はApache Kafkaにデータを送信する役割を持つ Producer について解説していきたいと思います。

そもそもKafkaがわからない・・という方はコチラで解説していますので、よければご一読ください!

 

Producer内部の仕組み

Producerの中身

以下ではProducerの具体的な中身を示しています。図の点線部分がProducerの範囲となっています。

 

メッセージ送信する順番としては、ProducerRecordをProducerに送信(send)してバイト列に変換します。

変換が終わるとメッセージがどのPartitionに送信されるかを確認して振り分け、これらのメッセージの集まりをBatchとして一斉に送信します。

 

メッセージレコードの中身

メッセージレコード(ProducerRecord)の中身は以下のようになっています。

  • 送信先Topic名
  • メッセージ内容(Value)
  • 送信先Partition名
  • キー
  • ヘッダー
  • タイムスタンプ

上二つのTopic名とメッセージ内容は必須フィールドになります。

 

Partition名は、Topicの中のどのpartitionに送信するかを判断する情報です。キーはpartitionが指定されていない場合に、これをハッシュ化することで自動的に送信先を決定します。

キーもpartitionも指定がない場合は、ラウンドロビン法に基づいて送信先が決定されます。

ヘッダーにはメッセージレコードについての情報(メタデータ)が指定されます。例えばメッセージが圧縮されていた場合、圧縮した拡張子の種類などが格納されます。

タイムスタンプではメッセージに関する時間の記録が該当します。指定がない場合は、Producer側での現在時刻が指定されます。

Producerの他の機能

以下ではメッセージ送信以外でのProducerの機能について解説していきます。

メッセージの圧縮

多くのメッセージを扱う以上、Kafkaでは負荷が大きくかかってしまうことがあります。そこでProducer側であらかじめメッセージを圧縮することで、容量を小さくして負荷を下げることができます。

Broker側に送信されたかを確認

Producerが送信した後、Brokerからメッセージが届いているかどうかを確認をします。この機能はKafkaの強みである「メッセージ到達保障」を支えるものだと言えます。もしBrokerからメッセージが届いていないという確認がきたら、Producerから再度メッセージが送信されます。(エラーによっては再送信できないものもあります)

メッセージの重複を防ぐ

メッセージ再送信をするときに1回目のメッセージが実は届いていた場合、メッセージが重複する場合があります。そこでProducerではあらかじめメッセージに個別のidを付与することで、重複を検知することができます。

 

 

まとめ

今回はProducerの中身について簡単に解説しました。

次回では、Producerが、スループットや耐障害性を考えていくうえでどう運用していくべきかを解説していきたいと思います。

最後まで読んでいただきありがとうございました!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です