Hi, that looks good.

There are also some REST calls that can be reduced.

As: When unloadNamespace, if a bund on this broker, can be directly unloaded.


Thanks,
Baodi Shi

> On Jul 7, 2022, at 15:3330, Enrico Olivelli <eolive...@gmail.com> wrote:
> 
> Xiaoyu Hou,
> I support this PIP
> 
> Enrico
> 
> Il giorno gio 7 lug 2022 alle ore 05:37 Michael Marshall
> <mmarsh...@apache.org> ha scritto:
>> 
>> Hi Xiaoyu Hou,
>> 
>> Thank you for your proposal. I agree that this proposal could help
>> reduce unnecessary overhead by calling the internal broker's methods
>> directly instead of initiating a new connection, with all that
>> entails. It might be interesting to hear why it was implemented that
>> way in the first place.
>> 
>> As you mentioned, there are other internal calls. I see additional
>> usages of the `pulsar().getAdminClient()` method in the
>> NamespacesBase, the TenantsBase, the ClustersBase, and the
>> TransactionsBase.
>> 
>> My one concern with the proposed solution is how it handles back
>> pressure. While the current solution has its weaknesses, one of its
>> benefits is that it has back pressure at the request level in the http
>> server. Do we need to think about adding back pressure to ensure that
>> a single call does not dispatch too many internal async calls? I am
>> thinking about calls like `internalDeleteNamespace`, which dispatches
>> futures to delete every topic in the namespace.
>> 
>> Note: I do not see any security (authentication/authorization)
>> concerns with this change. The current recursive calls to the same
>> broker are performed by a pulsar client that needs to be configured
>> with a super user token in order to work when authentication and
>> authorization are enabled. Therefore, if the client has sufficient
>> permission to perform the operation, it is assumed to have permission
>> for the calls that result from it.
>> 
>> Thanks,
>> Michael
>> 
>> On Wed, Jul 6, 2022 at 9:42 PM Anon Hxy <anonhx...@gmail.com> wrote:
>>> 
>>> 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