There is a conflict in PIP numbers.   The issue has moved to PIP-183.

Also there is not only one method that should be modified, I will use this
PIP to track all of them.


Thanks,
Xiaoyu Hou

Anon Hxy <anonhx...@gmail.com> 于2022年7月6日周三 22:12写道:

> Hi Pulsar community:
>
> I open a pip to discuss "Reduce unnecessary REST call in broker"
>
> Proposal Link: https://github.com/apache/pulsar/issues/16422
>
> ---
>
> ## Motivation
>
> The design of admin API now is such that: when handle a partitioned topic
> request, the broker will query the topic's partition meta, and then use the
> internal admin client to query all the non-partitioned topics (I.e. the
> suffix of  the topic name is `-partition-`),
> even if the non-partitioned topic is owned by the broker, which will cause
> unnecessary  REST call in the broker.
>
> we can call the methods directlly,  who handle the non-partitioned topic,
>  to reduce the unnecessary  REST call.
>
> ## Goal
>
> * Try to call the methods directlly if the non-partitioned topic is owned
> by the broker
>
> ## Implementation
>
> * We need to check all the place where
> `org.apache.pulsar.broker.PulsarService#getAdminClient` is invoked in
> `org.apache.pulsar.broker.admin.impl.PersistentTopicsBase`
> * take `internalGetPartitionedStats` for example:
>
>   *  Original:
> ```
>    for (int i = 0; i < partitionMetadata.partitions; i++) {
>                 try {
>                     topicStatsFutureList
>
> .add(pulsar().getAdminClient().topics().getStatsAsync(
>
> (topicName.getPartition(i).toString()), getPreciseBacklog,
> subscriptionBacklogSize,
>                                     getEarliestTimeInBacklog));
>                 } catch (PulsarServerException e) {
>                     asyncResponse.resume(new RestException(e));
>                     return;
>                 }
>             }
>   ```
>
>    *  Suggest to do like this:
>    ```
>  for (int i = 0; i < partitionMetadata.partitions; i++) {
>                 TopicName topicNamePartition = topicName.getPartition(i);
>                 topicStatsFutureList.add(
>
> pulsar().getNamespaceService().isServiceUnitOwnedAsync(topicName)
>                         .thenCompose(owned -> {
>                             if (owned) {
>                                 // local call
>                                 return
> getTopicReferenceAsync(topicNamePartition)
>                                     .thenCompose(topic ->
>
> topic.asyncGetStats(getPreciseBacklog, subscriptionBacklogSize,
>                                             getEarliestTimeInBacklog));
>                             } else {
>                                 // call from admin client
>                                 try {
>
> pulsar().getAdminClient().topics().getStatsAsync(topicNamePartition.toString()),
>                                         getPreciseBacklog,
> subscriptionBacklogSize, getEarliestTimeInBacklog)
>                                 } catch (PulsarServerException e) {
>                                     throw new RestException(e);
>                                 }
>                             }
>                         })
>                 );
>    ```
>
> Thanks,
> Xiaoyu Hou
>
>
>

Reply via email to