皆さんこんにちは!今回は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が、スループットや耐障害性を考えていくうえでどう運用していくべきかを解説していきたいと思います。
最後まで読んでいただきありがとうございました!