面试题答案
一键面试RocketMQ权限控制模型
NameServer 和 Broker 协同权限管理
- NameServer 角色:NameServer 主要负责管理 Broker 的元数据信息,包括 Broker 的地址、Topic 路由信息等。在权限管理方面,NameServer 并不直接参与具体的权限校验逻辑。它为 Broker 提供了一个集中式的元数据存储和查询服务,使得 Broker 之间能够共享和同步这些关键信息,间接辅助 Broker 进行权限管理。例如,当 Broker 需要获取某个 Topic 的所有路由信息时,会向 NameServer 查询,这其中可能涉及到权限相关的 Topic 信息,NameServer 提供准确的信息供 Broker 进一步处理权限相关操作。
- Broker 角色:Broker 是 RocketMQ 中实际处理消息存储、转发以及权限校验的核心组件。它在启动时会向 NameServer 注册自身信息,并定期同步 Topic 路由信息。当生产者发送消息或消费者拉取消息时,Broker 会根据配置的权限策略对请求进行校验。例如,Broker 会检查生产者是否有权限向特定 Topic 发送消息,或者消费者是否有权限从特定 Topic 消费消息。
通过自定义权限策略限制生产者和消费者对特定 Topic 的访问
- 自定义权限策略配置:在 RocketMQ 中,可以通过配置文件来定义自定义的权限策略。例如,在
broker.conf
文件中,可以添加如下配置:
# 开启 ACL 功能
aclEnable=true
# 权限策略文件路径
aclFile=/path/to/acl.json
在 acl.json
文件中定义具体的权限策略,以下是一个示例:
[
{
"resource": "TopicTest",
"write": [
"producerGroup1"
],
"read": [
"consumerGroup1"
]
}
]
上述配置表示只有 producerGroup1
中的生产者有权限向 TopicTest
发送消息,只有 consumerGroup1
中的消费者有权限从 TopicTest
消费消息。
2. 生产者权限校验:当生产者向 Broker 发送消息时,Broker 会获取生产者所属的生产者组,并根据配置的权限策略检查该生产者组是否有权限向目标 Topic 发送消息。如果有权限,则继续处理消息发送;否则,拒绝该请求并返回相应的错误信息。
3. 消费者权限校验:当消费者向 Broker 拉取消息时,Broker 同样会获取消费者所属的消费者组,并依据权限策略判断该消费者组是否有权限从目标 Topic 消费消息。若有权限,则允许拉取操作;否则,拒绝请求。
实际应用场景举例
- 多租户场景:在云计算平台中,多个租户使用同一个 RocketMQ 集群。通过权限控制,可以确保每个租户的生产者只能向自己的 Topic 发送消息,消费者只能从自己的 Topic 消费消息,实现租户间的消息隔离。例如,租户 A 的生产者组
tenantAProducerGroup
只能向tenantA - Topic
发送消息,租户 A 的消费者组tenantAConsumerGroup
只能从tenantA - Topic
消费消息,防止不同租户之间的消息干扰。 - 敏感数据隔离:对于一些包含敏感数据的 Topic,如用户账户信息相关的 Topic。可以通过权限策略,仅允许特定的生产者组(如经过安全认证的业务系统)向该 Topic 发送消息,同时仅允许特定的消费者组(如专门处理用户账户信息的模块)从该 Topic 消费消息,从而保证敏感数据的安全性和隐私性。例如,只有
securityProducerGroup
有权限向userAccountTopic
发送消息,只有accountProcessorConsumerGroup
有权限从userAccountTopic
消费消息。