pip/pip-344.md
Topic auto-creation
pulsarClient.getPartitionsForTopic
pulsarClient.getPartitionsForTopicpulsarClient.getPartitionsForTopic(topicName), Pulsar will automatically create the partitioned topic metadata if it does not exist, either using HttpLookupService or BinaryProtoLookupService.Now pulsarClient.getPartitionsForTopic's behavior
| case | broker allow auto-create | param allow
create if not exists | non-partitioned topic | partitioned topic | current behavior |
| --- | --- | --- | --- | --- | --- |
| 1 | true/false | true/false | exists: true | | REST API: partitions: 0
Binary API: partitions: 0 |
| 2 | true/false | true/false | | exists: true
partitions: 3 | REST API: partitions: 3
Binary API: partitions: 3 |
| 3 | true | true | | | REST API:
- create new: true
- partitions: 3
Binary API:
- create new: true
- partitions: 3
|
| 4 | true | false | | | REST API:
- create new: false
- partitions: 0
Binary API:
not support
|
| 5 | false | true | | | REST API:
- create new: false
- partitions: 0
Binary API:
- create new: false
- partitions: 0
|
auto-create: see also the config allowAutoTopicCreation in broker.conf.create if not exists
PersistentTopics.getPartitionedMetadata, it is an optional param which named checkAllowAutoCreation, and the default value is false.pulsar-admin API, it depends on the HTTP API PersistentTopics.getPartitionedMetadata, and it always sets the param checkAllowAutoCreation to false and can not be set manually.HttpLookupService.getPartitionedTopicMetadata, it depends on the HTTP API PersistentTopics.getPartitionedMetadata, and it always sets the param checkAllowAutoCreation to true and can not be set manually.BinaryProtoLookupService.getPartitionedTopicMetadata, it always tries to create partitioned metadata.REST API & HTTP API: Since there are only two implementations of the 4 ways to get partitioned metadata, we call HTTP API PersistentTopics.getPartitionedMetadata, pulsar-admin, and HttpLookupService.getPartitionedTopicMetadata HTTP API, and call BinaryProtoLookupService.getPartitionedTopicMetadata Binary API.The param create if not exists of the Binary API is always true.
pulsarClient.getPartitionsForTopic's behavior, it always tries to create the partitioned metadata, but the API name is getxxx.pulsarClient.getPartitionsForTopic's behavior, it returns a 0 partitioned metadata, but the topic does not exist. For the correct behavior of this case, we had discussed here before.PulsarClient.getPartitionsForTopic(String, boolean) to support the feature that just get partitioned topic metadata and do not try to create one. See detail below.0 partitioned metadata, respond to a not found error when calling pulsarClient.getPartitionsForTopic(String) if the topic does not exist.When you call the public API pulsarClient.getPartitionsForTopic, pulsar will not create the partitioned metadata anymore.
LookupService.java
- CompletableFuture<PartitionedTopicMetadata> getPartitionedTopicMetadata(TopicName topicName);
/**
* 1. Get the partitions if the topic exists. Return "{partition: n}" if a partitioned topic exists; return "{partition: 0}" if a non-partitioned topic exists.
* 2. When {@param createIfAutoCreationEnabled} is "false," neither partitioned topic nor non-partitioned topic does not exist. You will get an {@link PulsarClientException.NotFoundException}.
* 2-1. You will get a {@link PulsarClientException.NotSupportedException} if the broker's version is an older one that does not support this feature and the Pulsar client is using a binary protocol "serviceUrl".
* 3. When {@param createIfAutoCreationEnabled} is "true," it will trigger an auto-creation for this topic(using the default topic auto-creation strategy you set for the broker), and the corresponding result is returned. For the result, see case 1.
* @version 3.3.0
*/
+ CompletableFuture<PartitionedTopicMetadata> getPartitionedTopicMetadata(TopicName topicName, boolean createIfAutoCreationEnabled);
The behavior of the new API LookupService.getPartitionedTopicMetadata(TopicName, boolean).
| case | client-side param: createIfAutoCreationEnabled | non-partitioned topic | partitioned topic | broker-side: topic auto-creation strategy | current behavior |
|---|---|---|---|---|---|
| 1 | true/false | exists: true | REST/Binary API: {partitions: 0} | ||
| 2 | true/false | exists: true | |||
partitions: 2 | REST/Binary API: {partitions: 2} | ||||
| 3 | true | allowAutoTopicCreation: true <be> allowAutoTopicCreationType: non-partitioned | REST/Binary API: | ||
- create new: true | |||||
- {partitions: 0} | |||||
| 4 | true | allowAutoTopicCreation: true <be> allowAutoTopicCreationType: partitioned | |||
defaultNumPartitions: 2 | REST/Binary API: | ||||
- create new: true | |||||
- {partitions: 2} | |||||
| 5 | false | allowAutoTopicCreation: true | REST/Binary API: | ||
| - Not found error | |||||
| 6 | true | allowAutoTopicCreation: false | REST/Binary API: | ||
| - Not found error |
PulsarClient.java
// This API existed before. Not change it, thus ensuring compatibility.
+ @Deprecated it is not suggested to use now; please use {@link #getPartitionsForTopic(TopicName, boolean)}.
- CompletableFuture<List<String>> getPartitionsForTopic(String topic);
+ default CompletableFuture<List<String>> getPartitionsForTopic(String topic) {
+ getPartitionsForTopic(topic, true);
+ }
/**
* 1. Get the partitions if the topic exists. Return "[{partition-0}, {partition-1}....{partition-n}}]" if a partitioned topic exists; return "[{topic}]" if a non-partitioned topic exists.
* 2. When {@param createIfAutoCreationEnabled} is "false", neither the partitioned topic nor non-partitioned topic does not exist. You will get an {@link PulsarClientException.NotFoundException}.
* 2-1. You will get a {@link PulsarClientException.NotSupportedException} if the broker's version is an older one that does not support this feature and the Pulsar client is using a binary protocol "serviceUrl".
* 3. When {@param createIfAutoCreationEnabled} is "true," it will trigger an auto-creation for this topic(using the default topic auto-creation strategy you set for the broker), and the corresponding result is returned. For the result, see case 1.
* @version 3.3.0
*/
CompletableFuture<List<String>> getPartitionsForTopic(String topic, boolean createIfAutoCreationEnabled);
The behavior of the new API PulsarClient.getPartitionsForTopic(String, boolean).
| case | client-side param: createIfAutoCreationEnabled | non-partitioned topic | partitioned topic | broker-side: topic autp-creation strategy | current behavior |
|---|---|---|---|---|---|
| 1 | true/false | exists: true | REST/Binary API: ["{tenat}/{ns}/topic"] | ||
| 2 | true/false | exists: true | |||
partitions: 2 | REST/Binary API: ["{tenat}/{ns}/topic-partition-0", "{tenat}/{ns}/topic-partition-1"] | ||||
| 3 | true | allowAutoTopicCreation: true <be> allowAutoTopicCreationType: non-partitioned | REST/Binary API: | ||
- create new: true | |||||
- ["{tenat}/{ns}/topic"] | |||||
| 4 | true | allowAutoTopicCreation: true <be> allowAutoTopicCreationType: partitioned | |||
defaultNumPartitions: 2 | REST/Binary API: | ||||
- create new: true | |||||
- ["{tenat}/{ns}/topic-partition-0", "{tenat}/{ns}/topic-partition-1"] | |||||
| 5 | false | allowAutoTopicCreation: true | REST/Binary API: | ||
| - Not found error | |||||
| 5 | true | allowAutoTopicCreation: false | REST/Binary API: | ||
| - Not found error |
CommandPartitionedTopicMetadata
message CommandPartitionedTopicMetadata {
+ optional bool metadata_auto_creation_enabled = 6 [default = true];
}
FeatureFlags
message FeatureFlags {
+ optional bool supports_binary_api_get_partitioned_meta_with_param_created_false = 5 [default = false];
}
Old version (< 3.0.6) client and New version (>= 3.0.6) Broker: The client will call the old API.
New version client and Old version Broker: The feature flag supports_binary_api_get_partitioned_meta_with_param_created_false will be false. The client will get a not-support error if the param createIfAutoCreationEnabled is false in the following cases: