Pulsar学习笔记之 Authorization授权与Quota配额机制

Pulsar Authorization 授权

Pulsar的授权需要开启认证,且需要单独在Broker和Proxy的配置中开启,否则所有认证通过后的用户角色将对所有资源有权限,如未开启认证则所有客户端对所有资源有权限;授权也支持插件化扩展机制,但使用自带的实现就可以满足需求了。此外还可以配置超级用户角色和代理角色,对于集群的管理和Proxy访问等非常有用。

开启Pulsar认证配置

之前我们在 Pulsar学习笔记之 Authentication认证机制与插件开发 文章中介绍了Pulsar的认证机制和认证插件的开发,有需要可以移步过去看认证插件的配置,也可以使用官方推荐的认证插件。

开启Pulsar授权配置示例

# broker.conf
authorizationEnabled=true
authorizationProvider=org.apache.pulsar.broker.authorization.PulsarAuthorizationProvider
superUserRoles=user-role-123456
proxyRoles=pulsar_proxy_role_1

开启授权后,认证通过的用户角色默认是没有任何权限的,需要事先创建租户/命名空间,并给用户角色做授权。

创建租户和命名空间

bin/pulsar-admin tenants create my-tenant
bin/pulsar-admin namespaces create my-tenant/my-namespace
bin/pulsar-admin namespaces grant-permission my-tenant/my-namespace \
    --actions lookup,produce,consume \
    --role userrole-123457

客户端写入有权限命名空间下的Topic

AuthenticationTabaltAK at = new AuthenticationTabaltAK("test_access_key2", "test_access_secret");
//...
Producer<byte[]> producer = client.newProducer()
            .topic("my-tenant/my-namespace/my-topic")
            .create();

Pulsar resource-quotas 资源配额

Pulsar resource-quotas 资源配额 用于限制命名空间级别的出入消息速率、带宽等

bin/pulsar-admin resource-quotas set \
    --memory 20 \
    --msgRateIn 2 \
    --msgRateOut 20 \
    --bandwidthIn 2 \
    --bandwidthOut 20 \
    --bundle "0x00000000_0x40000000" \
    --namespace "my-tenant/my-namespace"
  
bin/pulsar-admin namespaces policies my-tenant/my-namespace 
bin/pulsar-admin resource-quotas reset-namespace-bundle-quota \
    --bundle "0x00000000_0x40000000" \
    --namespace "my-tenant/my-namespace"

Pulsar backlog-quotas 配置

bin/pulsar-admin namespaces set-backlog-quota "my-tenant/my-namespace" \
  --limit 100 \
  --policy producer_exception / producer_request_hold / consumer_backlog_eviction

bin/pulsar-admin namespaces policies my-tenant/my-namespace

限制backlog的大小可以生效,同时有一些“小特点”,但影响不大

  • 定期检测(默认看是约60s),所以首次连接后大量写入可能会超过
  • 大小限制并不那么严格,如设置 --limit 100 --policy consumer_backlog_eviction,停止写入后能消费出不止100Bytes数据
  • 超过后客户端再次连接会报错: Cannot create producer on topic with backlog quota exceeded。

3种policy的表现

  • producer_exception,客户端会直接抛出异常
  • producer_request_hold,客户端会阻塞,但当达到超时时间也会抛出超时异常
  • consumer_backlog_eviction,客户端继续写入,未及时消费的数据会被删除

服务端研发
个人博客:[链接] GitHub:[链接]

Server Engineer (Java/Golang/LNMP)

1.3k 声望
64 粉丝
0 条评论
推荐阅读
对 Pulsar 集群的压测与优化
前言这段时间在做 MQ(Pulsar)相关的治理工作,其中一个部分内容关于消息队列的升级,比如:一键创建一个测试集群。运行一批测试用例,覆盖我们线上使用到的功能,并输出测试报告。模拟压测,输出测试结果。本质...

crossoverJie阅读 766评论 1

如何设计一个消息队列?
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬阅读 590

【RocketMq】RocketMq-NameServ 源码分析(Ver4.9.4)
RocketMq3.X的版本和Kafka一样是基于Zookeeper进行路由管理的,但是这意味着运维需要多部署一套Zookeeper集群,后来RocketMq选择去ZK最终出现了NameServ。NameServ作为RocketMq源码阅读的切入点非常不错,本文将...

Xander阅读 403

【RocketMq】RocketMq 4.9.4 Windows-docker 部署
注意个人使用了4.9.4的Rocketmq版本进行学习部署使用。因为windows上使用docker部署不同版本的RockerMq可能会有不同的情况,这里仅保证4.9.4的版本可以正确运行。

Xander阅读 387

搭建源码调试环境—RocketMQ源码分析(一)
这是因为掌握了整体架构,可以让我们迅速了解各个方面的特性,并且可以方便我们后续快速定位功能模块对应的代码文件。话不多说,我们开始看RocketMQ目录结构。

Alan海鑫阅读 344

RocketMQ Connect 构建流式数据处理平台
RocketMQ Connect 是一款可扩展的在 RocketMQ 与其他系统之间做流式数据传输的工具,能够轻松将 RocketMQ 与其他存储技术进行集成。RocketMQ Connect 使用特定的 Source 插件类型,将数据发送到 RocketMQ  Topics...

ApacheRocketMQ阅读 335

封面图
消息队列常见的使用场景
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~Gith...

程序员大彬阅读 331

Server Engineer (Java/Golang/LNMP)

1.3k 声望
64 粉丝
宣传栏