切换主题
14. ACL 与生产配置:从能跑到能上线
准备上线
系统要进生产环境了。开发环境里大家都用 localhost:8081,没有权限,没有隔离。上线前必须补齐安全和配置。
RocketMQ 不是只要能发消息就算完成。生产环境至少要关注:
- endpoint。
- access key 和 secret key。
- namespace 或环境隔离。
- topic 和 consumerGroup 命名。
- 超时、重试次数、SSL。
- 日志、监控、补偿入口。
Producer 配置
properties
rocketmq.producer.endpoints=rocketmq-proxy.prod.example.com:8081
rocketmq.producer.topic=order-event-topic
rocketmq.producer.access-key=${ROCKETMQ_ACCESS_KEY}
rocketmq.producer.secret-key=${ROCKETMQ_SECRET_KEY}
rocketmq.producer.request-timeout=3
rocketmq.producer.max-attempts=3
rocketmq.producer.ssl-enabled=true
rocketmq.producer.namespace=prodRocketMQProperties.Producer 在 2.3.4 中包含这些字段:accessKey、secretKey、endpoints、topic、requestTimeout、sslEnabled、maxAttempts、namespace。
Consumer 配置
SimpleConsumer:
properties
rocketmq.simple-consumer.endpoints=rocketmq-proxy.prod.example.com:8081
rocketmq.simple-consumer.consumer-group=ops-replay-group
rocketmq.simple-consumer.topic=order-event-topic
rocketmq.simple-consumer.tag=*
rocketmq.simple-consumer.access-key=${ROCKETMQ_ACCESS_KEY}
rocketmq.simple-consumer.secret-key=${ROCKETMQ_SECRET_KEY}
rocketmq.simple-consumer.request-timeout=3
rocketmq.simple-consumer.await-duration=5
rocketmq.simple-consumer.ssl-enabled=true
rocketmq.simple-consumer.namespace=prodPushConsumer 可以在注解里使用配置占位符:
java
@RocketMQMessageListener(
endpoints = "${demo.order.rocketmq.endpoints}",
accessKey = "${demo.order.rocketmq.access-key}",
secretKey = "${demo.order.rocketmq.secret-key}",
topic = "${demo.order.rocketmq.topic}",
consumerGroup = "${demo.order.rocketmq.consumer-group}",
tag = "${demo.order.rocketmq.tag}"
)
public class OrderPaidListener implements RocketMQListener {
// ...
}小技巧
不要把密钥写进 application-prod.properties。用环境变量、配置中心或密钥管理系统注入。
不同环境的 topic 和 group 要能看出环境:
text
prod.order-event-topic
staging.order-event-topic
prod.points-service-group
staging.points-service-group如果使用 namespace,就保持命名策略一致,不要一半靠 namespace,一半靠字符串前缀。
上线清单
| 项 | 检查 |
|---|---|
| endpoint | 指向正确 Proxy |
| ACL | key 权限最小化 |
| topic | 已创建,权限正确 |
| group | 不和其他环境混用 |
| 超时 | 有明确默认值 |
| 重试 | 失败可观察 |
| 幂等 | 消费端已实现 |
| 补偿 | 有后台任务或人工入口 |
| 日志 | 有 messageId、key、tag |
常见坑
生产和测试共用 group。
可能互相抢消息。密钥写死在代码仓库。
这是安全事故。只配置 producer,不配置 consumer 权限。
发送成功不代表消费能正常启动。
练习题
- 为什么生产环境不建议使用默认或随意 group 名?
- access key 和 secret key 应该怎么管理?
rocketmq.producer.topic在生产里有什么价值?
参考答案
- group 决定消费关系,混用会导致抢消息、重复消费或环境污染。
- 用环境变量、配置中心、密钥系统,不写入源码。
- 可以让 producer 预取 topic 路由,减少首次发送抖动。
来源
- 官方 ACL sample:https://github.com/apache/rocketmq-spring/tree/rocketmq-spring-all-2.3.4/rocketmq-v5-client-spring-boot-samples/rocketmq-v5-client-producer-acl-demo
RocketMQProperties:https://github.com/apache/rocketmq-spring/blob/rocketmq-spring-all-2.3.4/rocketmq-v5-client-spring-boot/src/main/java/org/apache/rocketmq/client/autoconfigure/RocketMQProperties.java