Skip to content

14. ACL 与生产配置:从能跑到能上线

准备上线

系统要进生产环境了。开发环境里大家都用 localhost:8081,没有权限,没有隔离。上线前必须补齐安全和配置。

RocketMQ 不是只要能发消息就算完成。生产环境至少要关注:

  1. endpoint。
  2. access key 和 secret key。
  3. namespace 或环境隔离。
  4. topic 和 consumerGroup 命名。
  5. 超时、重试次数、SSL。
  6. 日志、监控、补偿入口。

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=prod

RocketMQProperties.Producer 在 2.3.4 中包含这些字段:accessKeysecretKeyendpointstopicrequestTimeoutsslEnabledmaxAttemptsnamespace

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=prod

PushConsumer 可以在注解里使用配置占位符:

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
ACLkey 权限最小化
topic已创建,权限正确
group不和其他环境混用
超时有明确默认值
重试失败可观察
幂等消费端已实现
补偿有后台任务或人工入口
日志有 messageId、key、tag

常见坑

  1. 生产和测试共用 group。
    可能互相抢消息。

  2. 密钥写死在代码仓库。
    这是安全事故。

  3. 只配置 producer,不配置 consumer 权限。
    发送成功不代表消费能正常启动。

练习题

  1. 为什么生产环境不建议使用默认或随意 group 名?
  2. access key 和 secret key 应该怎么管理?
  3. rocketmq.producer.topic 在生产里有什么价值?

参考答案

  1. group 决定消费关系,混用会导致抢消息、重复消费或环境污染。
  2. 用环境变量、配置中心、密钥系统,不写入源码。
  3. 可以让 producer 预取 topic 路由,减少首次发送抖动。

来源

Built with VitePress. Deployed on Cloudflare Pages.