web-dev-qa-db-ja.com

動的パーティション数を含むkafkaトピックを作成することは可能ですか?

私はkafkaを使用して、Webサイトユーザーによるページアクセスのイベントを分析サービスにストリーミングしています。各イベントには、消費者に関する次の詳細が含まれています。

  • ユーザーID
  • ユーザーのIPアドレス

非常に高いスループットが必要なので、パーティションキーをuserId-ipAddressとしてトピックを分割することにしました

UserId 1000およびIPアドレス10.0.0.1の場合、イベントのパーティションキーは「1000-10.0.0.1」になります。

この使用例では、パーティションキーは動的であるため、トピックの作成時にパーティションの数を事前に指定します。 kafka動的パーティション数で)トピックを作成することは可能ですか?

この種類のパーティショニングを使用することは良い習慣ですか、それともこれを達成できる他の方法はありますか?

20
vivek_jonam

Kafkaトピックを作成することはできません。トピックを作成するときに、パーティション数を指定する必要があります。後で手動で変更できます レプリケーションツール

しかし、なぜ最初に動的パーティション数が必要なのか理解できません。パーティションキーはパーティションの数とは関係ありません。パーティションキーは、10個のパーティションまたは1000個のパーティションで使用できます。 Kafkaトピックにメッセージを送信する場合、Kafkaはそれを特定のパーティションに送信する必要があります。すべてのパーティションは、単に番号であるそのIDによって識別されます。= Kafkaはこのようなものを計算します

partition_id = hash(partition_key) % number_of_partition

そして、メッセージをパーティションpartition_idに送信します。パーティションよりもはるかに多くのユーザーがいる場合は、大丈夫です。その他の提案:

  • userIdをパーティションキーとして使用します。おそらく、パーティションキーの一部としてIPアドレスは必要ありません。それは何に適していますか?通常は、単一のユーザーからのすべてのメッセージが単一のパーティションに到達する必要があります。パーティションキーとしてIPアドレスを使用している場合、1人のユーザーからのメッセージが複数のパーティションに送信される可能性があります。私はあなたのユースケースを知りませんが、それはあなたが望むものではありません。
  • すべてのメッセージを処理するために必要なパーティションの数を測定します。次に、10倍以上のパーティションを作成します。実際に必要な数よりも多くのパーティションを作成できます。 Kafka気にしないで、パフォーマンスのペナルティはありません。参照してください Kafkaクラスタ内のトピック/パーティションの数を選択する方法?

現在、システム内のすべてのメッセージを処理できるはずです。トラフィックが増加した場合は、さらにKafkaブローカーを追加し、レプリケーションツールを使用してパーティションのリーダー/レプリカを変更できます。トラフィックが10回を超えて増加した場合は、新しいパーティションを作成する必要があります。

22