pulsar topic资源的创建

187 阅读2分钟

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并启动

image.png image-1.png

WebService的实例化就是在为jetty服务配置好自定义的pulsar connector连接器

image-2.png

接下来的addWebServerHandlers方法,其中为jetty配置了处理http请求的handler

image-3.png

深入webService的addRestResource方法查看,其中注册了jersey restful框架,并开启指定包扫描jersey注解,以及开启异步,添加过滤器等

image-4.png

回到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相关的管理流的

image-5.png

pulsar 客户端创建topic

pulsar创建topic的代码,这里以创建非分区主题为例

pulsarAdmin.topics().createNonPartitionedTopic(topicName)

一直深入查看createNonPartitionedTopic方法,直到createNonPartitionedTopicAsync方法,该方法内部构造请求并发送

image-6.png

validateTopic校验topic名,并加入到TopicName的缓存中,topicPath方法构造请求路径,其中可以看到请求的admin是v2包中的,最后拼接的路径为/admin/v2/persistent/{tenant}/{namespace}/{topic},租户,命名空间,主题名都包含在topic完整的参数名中,值得注意的是在加入TopicName缓存时会进行TopicName的实例化

image-7.png

最后asyncPutRequest方法执行请求发送的动作

pulsar处理http请求创建主题

根据jersey注解,可知创建非分区主题的请求由PersistentTopics的createNonPartitionedTopic方法处理

image-8.png

validateNamespaceName校验命名空间,并缓存实例化NamespaceName,validateTopicName方法校验主题,并缓存实例化TopicName

查看internalCreateNonPartitionedTopic方法,关注getOrCreateTopic方法

image-9.png image-10.png

getTopic方法中是执行创建主题的方法,其中关注loadOrCreatePersistentTopic方法

image-11.png

loadOrCreatePersistentTopic方法中关注checkOwnershipAndCreatePersistentTopic方法

image-12.png

checkOwnershipAndCreatePersistentTopic方法中关注createPersistentTopic方法

image-13.png image-14.png

该方法的OpenLedgerCallback回调方法中实例化主题,并在主题中注册ledger

到这里,基本就了解了pulsar中是如何通过管理流创建topic资源的,而关于其他比如租户,命名空间等都可以按照这种思路进行梳理。