web-dev-qa-db-fra.com

Un producteur Kafka peut-il créer des sujets et des partitions?

actuellement j'évalue différents systèmes de messagerie. Il y a une question liée à Apache Kafka à laquelle je n'ai pas pu répondre moi-même.

Est-il possible pour un Kafka producteur de créer dynamiquement des sujets et des partitions (sur des sujets existants)? Si oui, y a-t-il un inconvénient?)

Merci d'avance

9
smartwepa

Actualisé:

Le courtier kafka a une propriété: auto.create.topics.enable

Si vous définissez cela sur true si le producteur publie un message sur le sujet avec le nouveau nom de sujet, il créera automatiquement un sujet pour vous.

L'équipe Confluent recommande de ne pas le faire car l'explosion des sujets, en fonction de votre environnement, peut devenir difficile à gérer et la création du sujet aura toujours les mêmes valeurs par défaut lors de sa création. Il est important d'avoir un facteur de réplication d'au moins 3 pour garantir la durabilité de vos sujets en cas de défaillance du disque.

12
user2122031

De Java vous pouvez créer un sujet, si nécessaire. Qu'il soit recommandé ou non, cela dépend du cas d'utilisation. Par exemple, si le nom de votre sujet est fonction de la charge utile entrante pour le producteur, il peut être utile. Voici l'extrait de code qui fonctionne dans 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();
}

Remarque: Il est uniquement autorisé d'augmenter non. de partitions.

3
Bitswazsky

Lorsque vous démarrez votre courtier kafka vous pouvez définir un tas de propriétés dans conf/server.properties fichier. L'une des propriétés est auto.create.topics.enable si vous définissez ce paramètre sur true (par défaut) kafka créera automatiquement un sujet lorsque vous enverrez un message à un sujet inexistant. Le numéro de partition sera défini par les paramètres par défaut dans ce même fichier.

Inconvénients: pour autant que je sache, les sujets créés de cette façon auront toujours les mêmes paramètres par défaut (partitions, répliques ...).

2
ImbaBalboa

Pour tout système de messagerie, je ne pense pas qu'il soit recommandé de créer un sujet/partition ou une file d'attente de manière dynamique par producteur.

Pour votre cas d'utilisation, vous pouvez probablement utiliser device_id comme clé de partition as pour distinguer les messages. De cette façon, vous pouvez utiliser un sujet.

1
Girdhar Sojitra