RocketMQ-Topic命名规则

RocketMQ的Topic命名有特定规则,包括字符限制在127个,仅允许数字、字母、下划线和中划线,并且不能与默认的TBW102标识符重名,区分大小写。了解这些规则对于正确操作RocketMQ至关重要。
  1. 不能为空

  2. 只能包含%数字大小写字母及下划线和中划线

  3. 长度不能超过255个字符(在broker中限制却是127),以broker为主

    在4.6.1版本中已经统一为127

  4. 不能与默认用于判断是否可自动创建topic(TBW102)重名

public class Validators {
	public static void checkTopic(String topic) throws MQClientException {
    if (UtilAll.isBlank(topic)) {
        throw new MQClientException("The specified topic is blank", null);
    }

    //public static final String VALID_PATTERN_STR = "^[%|a-zA-Z0-9_-]+$";
    if (!regularExpressionMatcher(topic, PATTERN)) {
        throw new MQClientException(String.format(
            "The specified topic[%s] contains illegal characters, allowing only %s", topic,
            VALID_PATTERN_STR), null);
    }

    //在4.6.1版本中已经统一为127
    if (topic.length() > CHARACTER_MAX_LENGTH) {
        throw new MQClientException("The specified topic is longer than topic max length 255.", null);
    }

    //whether the same with system reserved keyword
    //public static final String AUTO_CREATE_TOPIC_KEY_TOPIC = "TBW102";
    if (topic.equals(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC)) {
        throw new MQClientException(
            String.format("The topic[%s] is conflict with AUTO_CREATE_TOPIC_KEY_TOPIC.", topic), null);
    }
}
}

DefaultMessageStore 实际存储消息的时候还有检测,Byte.MAX_VALUE=127
if (msg.getTopic().length() > Byte.MAX_VALUE) {
    log.warn("putMessage message topic length too long " + msg.getTopic().length());
    return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null);
}
  1. 大小写敏感

TOPIC

Topic

是两个不同的topic

在软件开发中,尤其是在 **消息队列(如 Kafka、RabbitMQ、RocketMQ)**、**事件驱动架构**、**微服务通信** 等场景中,`topic` 是一个非常重要的概念。良好的 `topic` 命名规范可以提升系统的可读性、可维护性和可扩展性。 --- ## ✅ Topic 命名通用规范(适用于 Kafka / RocketMQ / Pulsar 等) ### 📏 一、基本原则 | 原则 | 说明 | |------|------| | **语义清晰** | 名称应明确表达数据含义或业务领域 | | **统一风格** | 团队内部保持一致的命名规则 | | **小写字母** | 推荐使用小写,避免大小写混淆 | | **使用分隔符** | 推荐用 `-` 或 `_` 分隔单词,不要用空格或驼峰 | | **长度适中** | 不宜过长(建议 ≤ 64 字符),也不宜过短 | | **避免保留字** | 不要使用 `system`, `default`, `test` 等通用词 | --- ### 🧩 二、推荐命名格式:`<业务域>.<子系统>.<动作>|<数据实体>[.<附加信息>]` #### 示例: ```text user.service.created order.payment.succeeded inventory.warehouse.updated.location log.access.error ``` #### 各部分解释: | 段落 | 含义 | 示例 | |------|------|------| | `业务域` | 大的业务模块 | `user`, `order`, `payment`, `inventory` | | `子系统/服务` | 具体的服务或上下文 | `service`, `api`, `gateway` | | `动作/事件类型` | CRUD 或状态变化 | `created`, `updated`, `deleted`, `succeeded`, `failed` | | `数据实体(可选)` | 操作的对象 | `user`, `order`, `product` | | `附加信息(可选)` | 环境、版本等 | `.v1`, `.prod`, `.backup` | --- ### ✅ 三、具体命名示例 | 场景 | Topic 名称 | |------|-----------| | 用户注册成功 | `user.registration.succeeded` | | 订单支付失败 | `order.payment.failed` | | 商品库存变更 | `product.inventory.changed` | | 日志采集 - Nginx 访问日志 | `log.nginx.access` | | 退款流程完成 | `payment.refund.completed` | | 测试环境订单创建 | `order.service.created.test` | | V2 版本用户更新事件 | `user.service.updated.v2` | --- ### 🚫 四、不推荐的命名方式 | 错误示例 | 问题 | |--------|------| | `MyTopic` | 驼峰命名,不易读 | | `topic1`, `test` | 无意义,无法理解用途 | | `UserCreatedEvent` | 包含“Event”冗余,且大小写混用 | | `user_create` | 使用下划线(部分系统不友好) | | `com.company.user.created` | 类似包名,过于复杂 | > ⚠️ Kafka 官方文档建议:**使用点号 `.` 或连字符 `-` 分隔层级,避免下划线 `_` 和驼峰** --- ### 🔐 五、安全与权限控制建议 如果支持 ACL 权限控制,可以通过前缀进行权限管理: ```text public.* → 所有服务可消费 internal.* → 内部服务专用 sensitive.* → 加密 + 严格权限 dlq.* → 死信队列 retry.* → 重试主题 ``` --- ### 📁 六、配合目录结构设计(Kafka 风格) 你可以将 topic 视为“路径”,便于管理和监控: ```text <environment>.<domain>.<event-type>.<entity> ``` 例如: ```text prod.user.created dev.order.paid staging.payment.refunded ``` 或者反过来强调事件流方向: ```text source.event.type.version mysql.users.insert.v1 app.logs.error.v2 ``` --- ### 💡 七、最佳实践总结 ```markdown ✅ 使用小写 + 点号分隔:user.service.created ✅ 层级清晰:环境.业务.动作.实体(可选) ✅ 避免动词时态歧义:用 `created` 而不是 `create` ✅ 支持未来扩展:预留版本号 `.v2` ✅ 文档化所有 topic:建立 Topic 注册表或元数据中心 ``` --- ### ✅ 示例代码:Kafka 生产者发送消息(Java) ```java import org.apache.kafka.clients.producer.*; public class KafkaProducerExample { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); String topic = "user.service.created"; // 符合命名规范 String key = "user-1001"; String value = "{\"id\":1001,\"name\":\"Alice\",\"event_time\":\"2025-04-05T10:00:00Z\"}"; ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value); producer.send(record, (metadata, exception) -> { if (exception != null) { System.err.println("Send failed: " + exception.getMessage()); } else { System.out.printf("Sent to topic %s, partition %d, offset %d%n", metadata.topic(), metadata.partition(), metadata.offset()); } }); producer.close(); } } ``` > 上述代码中 `user.service.created` 是一个符合规范的 topic 名称。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值