apache / apache/pulsar

PIP-242: Topic name restrictions

Open
#19,239 5 comments 0 reactions 1 assignee Claimed by @mattisonchao View on GitHub
category/reliability Stale type/PIP
Dominant language
Java
Stars
15.3k
Forks
3.8k
Avg merge
1d 14h
Merged PRs (30d)
160

Description

### Motivation

Currently, the Apache Pulsar has no restrictions on the topic name. For example, we allowed users to create topic with `-partition-` keyword, which is confusing for our developers to identify whether this is a partition of a partitioned topic. Plus, we need to add more logic to be compatible with this special topic name. for example:

- https://github.com/apache/pulsar/pull/19240
- https://github.com/apache/pulsar/pull/19230
- https://github.com/apache/pulsar/pull/19171
- https://github.com/apache/pulsar/pull/19086
- ...

### Goal

This proposal aimed to add more restrictions for a topic name. that includes three parts as follows:
1. Using `NamedEntity` to validate the topic name characters.
2. Make the `-partition-` string the keyword. That allows the user to use it when it's a partitioned topic.

**Create a topic:**
_no corresponding partitioned topic_
- persistent://public/default/local-name (passed)
- persistent://public/default/local-name-partition-z (rejected by keyword)
- persistent://public/default/local-name-partition-0 (rejected by keyword)

_Has corresponding partitioned topic, **partitions=2** and topic partition name is **persistent://public/default/local-name**_

- persistent://public/default/local-name-partition-0 (passed, Because it is the partition topic's sub-partition)
- persistent://public/default/local-name-partition-z (rejected by keyword)
- persistent://public/default/local-name-partition-4 (rejected, Because it exceeds the number of maximum partitions)

**Create a partitioned topic(topic metadata)**

- persistent://public/default/local-name (passed)
- persistent://public/default/local-name-partition-z (rejected by keyword)
- persistent://public/default/local-name-partition-0 (rejected by keyword)

### Compatibility

We will introduce the new configuration `strictTopicNameEnabled` to support compatibility. Users can easily disable it to get rid of the restrictions.

### API Changes

Add a new configuration, `strictTopicNameEnabled=false`.

### Implementation

1. Add configuration `strictTopicNameEnabled=false` and make it dynamic.
2. Add topic name validation by `NamedEntity`
3. Add partitioned topic rejection logic.
4. Add warning logs to inform users that we do not recommend creating topics that name with the restrictions name when users disable `enableStrictTopicName`.
5. Make `strictTopicNameEnabled=true` in the next major release. and mark that this config will be removed in the future.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.