pulsar topic的创建
pulsar的管理流是基于jersey restful web服务框架运行在jetty web容器中实现的。因此需要对它们有所了解。
jersey官网:eclipse-ee4j.github.io/jersey/
jetty官网:eclipse.dev/jetty/
pulsar中启动jetty web服务
当pulsar启动时调用了PulsarService的start()方法,其中启动了实例化WebService并启动
WebService的实例化就是在为jetty服务配置好自定义的pulsar connector连接器
接下来的addWebServerHandlers方法,其中为jetty配置了处理http请求的handler
深入webService的addRestResource方法查看,其中注册了jersey restful框架,并开启指定包扫描jersey注解,以及开启异步,添加过滤器等
回到addWebServerHandlers方法,再查看webService调用addRestResources方法的参数就知道pulsar对有关管理流的以下几个包会进行jersey注解扫描,找到对应资源
- org.apache.pulsar.broker.admin.v1
- org.apache.pulsar.broker.admin.v2
- org.apache.pulsar.broker.admin.v3
- org.apache.pulsar.broker.lookup
- org.apache.pulsar.broker.rest
- org.apache.pulsar.broker.web
- org.apache.pulsar.common.configuration
以topic资源创建为例,查看org.apache.pulsar.broker.admin.v2包,会发现其中有PersistentTopics类,这个类就是用来处理topic相关的管理流的
pulsar 客户端创建topic
pulsar创建topic的代码,这里以创建非分区主题为例
pulsarAdmin.topics().createNonPartitionedTopic(topicName)
一直深入查看createNonPartitionedTopic方法,直到createNonPartitionedTopicAsync方法,该方法内部构造请求并发送
validateTopic校验topic名,并加入到TopicName的缓存中,topicPath方法构造请求路径,其中可以看到请求的admin是v2包中的,最后拼接的路径为/admin/v2/persistent/{tenant}/{namespace}/{topic},租户,命名空间,主题名都包含在topic完整的参数名中,值得注意的是在加入TopicName缓存时会进行TopicName的实例化
最后asyncPutRequest方法执行请求发送的动作
pulsar处理http请求创建主题
根据jersey注解,可知创建非分区主题的请求由PersistentTopics的createNonPartitionedTopic方法处理
validateNamespaceName校验命名空间,并缓存实例化NamespaceName,validateTopicName方法校验主题,并缓存实例化TopicName
查看internalCreateNonPartitionedTopic方法,关注getOrCreateTopic方法
getTopic方法中是执行创建主题的方法,其中关注loadOrCreatePersistentTopic方法
loadOrCreatePersistentTopic方法中关注checkOwnershipAndCreatePersistentTopic方法
checkOwnershipAndCreatePersistentTopic方法中关注createPersistentTopic方法
该方法的OpenLedgerCallback回调方法中实例化主题,并在主题中注册ledger
到这里,基本就了解了pulsar中是如何通过管理流创建topic资源的,而关于其他比如租户,命名空间等都可以按照这种思路进行梳理。