現在、さまざまなメッセージングシステムを評価しています。 Apacheに関連する質問がありますKafka自分では答えられませんでした。
Kafkaプロデューサーがトピックとパーティションを(既存のトピックについても)動的に)作成することは可能ですか?はいの場合、それに伴う欠点はありますか?
前もって感謝します
更新しました:
kafkaブローカーには、auto.create.topics.enableというプロパティがあります。
これをtrueに設定すると、プロデューサーが新しいトピック名でトピックにメッセージをパブリッシュすると、トピックが自動的に作成されます。
Confluentチームはこれを行わないことをお勧めします。これは、環境によってはトピックの爆発が扱いにくくなる可能性があり、トピックの作成時に作成されるデフォルトが常に同じになるためです。ディスク障害が発生した場合にトピックの耐久性を確保するには、レプリケーション係数を3以上にすることが重要です。
Javaから、必要に応じてトピックを作成できます。推奨かどうかは、ユースケースによって異なります。たとえば、トピック名がプロデューサーへの受信ペイロードの関数である場合、役に立つかもしれません。以下は、kafka 0.10.xで機能するコードスニペットです。
void createTopic(String zookeeperConnect, String topicName) throws InterruptedException {
int sessionTimeoutMs = <some-int-value>;
int connectionTimeoutMs = <some-int-value>;
ZkClient zkClient = new ZkClient(zookeeperConnect, sessionTimeoutMs, connectionTimeoutMs, ZKStringSerializer$.MODULE$);
boolean isSecureKafkaCluster = false;
ZkUtils zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperConnect), isSecureKafkaCluster);
Properties topicConfig = new Properties();
try {
AdminUtils.createTopic(zkUtils, topicName, 1, 1, topicConfig,
RackAwareMode.Disabled$.MODULE$);
} catch (TopicExistsException ex) {
//log it
}
zkClient.close();
}
注:増加のみ許可されています。パーティションの。
kafkaブローカーを開始するときに、conf/server.properties
ファイルで一連のプロパティを定義できます。これをtrueに設定すると、プロパティの1つはauto.create.topics.enable
です(デフォルトでは)kafkaは、存在しないトピックにメッセージを送信すると、トピックを自動的に作成します。パーティション番号は、この同じファイルのデフォルト設定によって定義されます。
短所:私の知る限り、この方法で作成されたトピックは常に同じデフォルト設定(パーティション、レプリカ...)になります。
どのメッセージングシステムでも、トピック/パーティションまたはキューをプロデューサーが動的に作成する方法はお勧めしません。
ユースケースでは、おそらく、device_idをパーティションキーとして使用してメッセージを区別できます。このようにして、1つのトピックを使用できます。