私はkafkaを使用して、Webサイトユーザーによるページアクセスのイベントを分析サービスにストリーミングしています。各イベントには、消費者に関する次の詳細が含まれています。
非常に高いスループットが必要なので、パーティションキーをuserId-ipAddress
としてトピックを分割することにしました
UserId 1000およびIPアドレス10.0.0.1の場合、イベントのパーティションキーは「1000-10.0.0.1」になります。
この使用例では、パーティションキーは動的であるため、トピックの作成時にパーティションの数を事前に指定します。 kafka動的パーティション数で)トピックを作成することは可能ですか?
この種類のパーティショニングを使用することは良い習慣ですか、それともこれを達成できる他の方法はありますか?
Kafkaトピックを作成することはできません。トピックを作成するときに、パーティション数を指定する必要があります。後で手動で変更できます レプリケーションツール 。
しかし、なぜ最初に動的パーティション数が必要なのか理解できません。パーティションキーはパーティションの数とは関係ありません。パーティションキーは、10個のパーティションまたは1000個のパーティションで使用できます。 Kafkaトピックにメッセージを送信する場合、Kafkaはそれを特定のパーティションに送信する必要があります。すべてのパーティションは、単に番号であるそのIDによって識別されます。= Kafkaはこのようなものを計算します
partition_id = hash(partition_key) % number_of_partition
そして、メッセージをパーティションpartition_id
に送信します。パーティションよりもはるかに多くのユーザーがいる場合は、大丈夫です。その他の提案:
userId
をパーティションキーとして使用します。おそらく、パーティションキーの一部としてIPアドレスは必要ありません。それは何に適していますか?通常は、単一のユーザーからのすべてのメッセージが単一のパーティションに到達する必要があります。パーティションキーとしてIPアドレスを使用している場合、1人のユーザーからのメッセージが複数のパーティションに送信される可能性があります。私はあなたのユースケースを知りませんが、それはあなたが望むものではありません。現在、システム内のすべてのメッセージを処理できるはずです。トラフィックが増加した場合は、さらにKafkaブローカーを追加し、レプリケーションツールを使用してパーティションのリーダー/レプリカを変更できます。トラフィックが10回を超えて増加した場合は、新しいパーティションを作成する必要があります。