Apache Pulsar 最初诞生于雅虎,当时就是为了解决雅虎内部各个部门之间数据的协调,所以多租户特性显得至关重用,Pulsar 从诞生之日起就考虑到多租户这一特性,并在后续的实现过程中,将其不断的完善。 多租户这一特性,使得各个部门之间可以共享同一份数据,不用单独部署独立的系统来操作数据,很好的保证了各部门间数据一致性的问题,同时简化维护成本。
在介绍 Pulsar 多租户之前,先来看一下,正常一个系统要实现一个多租户需要做哪些事情:
Pulsar 的多租户设计符合上述要求:
Pulsar的多租户性质主要体现在topic的URL中, 其结构如下:
persistent://tenant/namespace/topic
从URL中可以看出tenant(租户)是topic最基本的单元(比命名空间和topic名称更为基本)

一个多租户系统需要在租户内提供系统级别的安全性,细分来讲,主要可以归类为一下两点:
在 Pulsar 中,多租户的安全性是通过身份验证和授权机制实现的。当 client 连接到 pulsar broker 时,broker 会使用身份验证插件来验证此客户端的身份,然后为其分配一个 string 类型的 role token。role token 主要有如下作用:
Pulsar 目前支持一下几种身份认证, 同时支持自定义实现自己的身份认证程序
- 存储:
- Apache Pulsar 使用Bookkeeper来作为其存储层,bookie是Bookkeeper的实例,Bookkeeper本身就是具有I/O分离(读写分离)的特性,可以很多的做好IO隔离,提升读写的效率。
- 同时,不同的租户可以为不同的NameSpace配置不同的存储配额,当租户内消息的大小达到了存储配额的限制,Pulsar会采取相应的措施,例如:阻止消息生成,抛异常 或丢弃数据等。
Broker:
- 每个Borker使用的内存资源都是有上限的,当Broker达到配置的CPU或内存使用的阈值后,Pulsar会迅速的将流量转移到负载较小的Broker处理。
- 在生产和消费方面,Pulsar都可以进行流量控制,租户可以配置发送和接收的速率,避免出现一个客户端占用当前Broker的所有处理资源。
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants list
"public"
"pulsar"
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants create my-tenant
在创建租户时,可以使用-r 或者 --admin-roles标志分配管理角色。可以用逗号分隔的列表指定多个角色。
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants create my-tenant --admin-roles role1,role2,role3
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants create my-tenant -r role1
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants get my-tenant
{
"adminRoles" : [ ],
"allowedClusters" : [ "pulsar-cluster" ]
}
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants update -c pulsar-cluster my-tenant
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants delete my-tenant
[root@pulsar1 apache-pulsar-2.9.1]#
namespace是Pulsar中最基本的管理单元,在namespace这一层面,可以设置权限,调整副本设置,管理跨集群的消息复制,控制消息策略和执行关键操作。一个主题topic可以继承其所对应的namespace的属性,因此我们只需对namespace的属性进行设置,就可以一次性设置该namespace中所有主题topic的属性。
namespace有两种,分别是本地的namespace和全局的namespace:
虽然本地namespace和全局namespace的作用域不同,但是只要对他们进行适当的设置,都可以跨团队和跨组织共享。一旦生产者获得了namespace的写入权限,那么它就可以往namespace中的所有topic主题写入数据,如果某个主题不存在,则在生产者第一次写入数据时动态创建。
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces create my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces list my-tenant
"my-tenant/my-ns"
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces delete my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces policies my-tenant/my-ns
{
"auth_policies" : {
"namespace_auth" : { },
"destination_auth" : { },
"subscription_auth_roles" : { }
},
"replication_clusters" : [ "pulsar-cluster" ],
"bundles" : {
"boundaries" : [ "0x00000000", "0x40000000", "0x80000000", "0xc0000000", "0xffffffff" ],
"numBundles" : 4
},
"backlog_quota_map" : { },
"clusterDispatchRate" : { },
"topicDispatchRate" : { },
"subscriptionDispatchRate" : { },
"replicatorDispatchRate" : { },
"clusterSubscribeRate" : { },
"publishMaxMessageRate" : { },
"latency_stats_sample_rate" : { },
"deleted" : false,
"encryption_required" : false,
"subscription_auth_mode" : "None",
"offload_threshold" : -1,
"schema_auto_update_compatibility_strategy" : "Full",
"schema_compatibility_strategy" : "UNDEFINED",
"is_allow_auto_update_schema" : true,
"schema_validation_enforced" : false,
"subscription_types_enabled" : [ ],
"properties" : { }
}
[root@pulsar1 apache-pulsar-2.9.1]#
#获取给定命名空间复制集群的列表
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-clusters my-tenant/my-ns
"pulsar-cluster"
# 设置复制集群
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-clusters my-tenant/my-ns --clusters pulsar-cluster2
待定配额帮助Broker在某个名称空间达到某个阈值限制时限制其带宽/存储。管理员可以设置限制,并在达到限制后采取相应的行动。
查看quota配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-backlog-quotas my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-backlog-quota --limit 10G --limitTime 36000 --policy consumer_backlog_eviction my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
参数说明如下:
limit:Bookeeper使用磁盘空间大小
limitTime:单位为秒,在该时间内,Bookeeper使用磁盘空间大小
policy:有3个可选值
删除quota设置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces remove-backlog-quota my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
持久化策略可以为给定命名空间下 topic 上的所有消息配置持久等级。
查看持久化配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-persistence my-tenant/my-ns
null
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-persistence --bookkeeper-ack-quorum 2 --bookkeeper-ensemble 3 --bookkeeper-write-quorum 2 --ml-mark-delete-max-rate 0 my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
各参数含义如下:
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-message-ttl my-tenant/my-ns
null
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-message-ttl --messageTTL 600 my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces remove-message-ttl my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-dispatch-rate my-tenant/my-ns
null
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-dispatch-rate --dispatch-rate-period 2 --msg-dispatch-rate 2000 --byte-dispatch-rate 1048576 my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
参数说明如下:
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-subscription-dispatch-rate my-tenant/my-ns
null
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-subscription-dispatch-rate --dispatch-rate-period 2 --msg-dispatch-rate 2000 --byte-dispatch-rate 1048576 my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
参数说明如下:
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-replicator-dispatch-rate my-tenant/my-ns
null
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-replicator-dispatch-rate --dispatch-rate-period 2 --msg-dispatch-rate 2000 --byte-dispatch-rate 1048576 my-tenant/my-ns
[root@pulsar1 apache-pulsar-2.9.1]#
参数说明如下:
Topic:话题主题的含义,在一个名称空间下,可以定义多个Topic 通过Topic进行数据的分类划分,将不同的类别的消息放置到不同Topic,消费者也可以从不同Topic中获取到相关的消息,是一种更细粒度的消息划分操作,同时在Topic下可以划分为多个分片,进行分布式的存储操作,每个分片下还存在有副本操作,保证数据不丢失,当然这些分片副本更多是由bookkeeper来提供支持。
Pulsar 提供持久化与非持久化两种topic。 持久化topic是消息发布、消费的逻辑端点。 持久化topic地址的命名格式如下:
persistent://tenant/namespace/topic
非持久topic应用在仅消费实时发布消息与不需要持久化保证的应用程序。 通过这种方式,它通过删除持久消息的开销来减少消息发布延迟。 非持久化topic地址的命名格式如下:
non-persistent://tenant/namespace/topic
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics create non-persistent://my-tenant/my-ns/my-non-partitioned-topic
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics create-partitioned-topic persistent://my-tenant/my-ns/my-partitioned-topic --partitions 3
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics list my-tenant/my-ns
"persistent://my-tenant/my-ns/my-partitioned-topic-partition-0"
"persistent://my-tenant/my-ns/my-partitioned-topic-partition-1"
"persistent://my-tenant/my-ns/my-partitioned-topic-partition-2"
[root@pulsar1 apache-pulsar-2.9.1]#
可以看到my-non-partitioned-topic这个topic已经被删除了。这是因为一个topic被创建后,如果在创建后的60秒内不活动,就会被自动删除。可以通过如下两个参数进行控制
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics update-partitioned-topic persistent://my-tenant/my-ns/my-partitioned-topic --partitions 6
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics delete non-persistent://my-tenant/my-ns/my-non-partitioned-topic
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics delete-partitioned-topic persistent://my-tenant/my-ns/my-partitioned-topic
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics subscriptions persistent://public/default/my-partitioned-topic
"consume-test"
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]#
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics unsubscribe -s "consume-test" persistent://public/my-partitioned-topic
[root@pulsar1 apache-pulsar-2.9.1]#
pulsar-admin topics grant-permission --actions produce,consume --role application1 persistent://test- tenant/ns1/tp1
pulsar-admin topics grant-permission --actions produce,consume --role application1 persistent://test- tenant/ns1/tp1
pulsar-admin topics revoke-permission --role application1 persistent://test-tenant/ns1/tp1
{
"application1": [
"consume",
"produce"
]
}
参考:
https://blog.csdn.net/yy8623977/article/details/123605211
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
我在尝试使用Nokogiri构建XML文档时遇到了一个小问题。我想将我的元素之一称为“文本”(请参阅下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似以下的操作xml.text--但它似乎是.text是Nokogiri已经用来做其他事情的方法。因此,当我写这行时xml.textNokogiri没有创建名为的新元素但只是写了意味着成为元素内容的文本。我怎样才能让Nokogiri实际制作一个名为的元素??builder=Nokogiri::XML::Builder.newdo|xml|xml.TEI("xmlns"=>"http://www.tei-c.org/ns/1.0"
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
如果我生成一个名为"product"的脚手架,当我使用它们编写我的应用程序时,它们之间有什么区别?@products,@product,@Product,@Products,产品,Product、product和products(我很确定这些并没有全部用到,但它至少应该让我知道我在做什么'指的是)。对于@/capitalization/plurality的每个组合的含义,我似乎找不到简单的解释。将不胜感激。 最佳答案 你可以阅读Rubystyleguide和Railsstyleguide,您会得到问题的答案。
我想在服务器启动时在我的Rails应用程序中订阅一个mqtt主题,并保持订阅始终处于事件状态和运行状态。我正在使用这个mqttgem进行mqtt通信:https://github.com/njh/ruby-mqtt这是我现在拥有的:在application.rb中:config.after_initializedomqttSub=BackgroundMQTT.newmqttSub.runend后台MQTT类:classMQTTSubscriberdefrunThread.newdoMQTT::Client.connect(:host=>'localhost',:port=>1883,)
我正在根据Rails指南的建议开发Rails应用程序,以创建包含翻译的文件夹树和文件。我的文件夹树与此类似:|-defaults|---es.rb|---en.rb|-models|---book|-----es.rb|-----en.rb|-views|---defaults|-----es.rb|-----en.rb|---books|-----es.rb|-----en.rb|---users|-----es.rb|-----en.rb|---navigation|-----es.rb|-----en.rbconfig/locales/views/books/en.yml中的内容
在我的应用程序中我有classUserincludeUser::FooendUser::Foo定义在app/models/user/foo.rb现在我正在使用一个定义了自己的Foo类的库。我收到此错误:warning:toplevelconstantFooreferencedbyUser::FooUser仅引用具有完整路径的Foo,User::Foo,而Foo实际上从来没有指的是Foo。这是怎么回事?更新:才想起我之前遇到过同样的问题,在问题1中看到这里:HowdoIrefertoasubmodule's"fullpath"inruby? 最佳答案