> Maybe we can add the new API to the pulsar-client-original module? like we 
> currently do.

Adding stable APIs to the pulsar-client-original module that
represents the internal implementations is not a good way IMO. I'm
wondering why we need to configure a Netty EventLoop? Is there any
alternative class in the Java standard library?

Thanks,
Yunze

On Wed, Dec 28, 2022 at 10:18 PM PengHui Li <peng...@apache.org> wrote:
>
> Hmmm
>
> I found that if we want to provide the public API(shared event loop) in the
> pulsar-client-api module.
> We need to add Netty dependency to the pulsar-client-api module.
> It's not a good idea to have Netty dependency in the pulsar-client-api
> module.
>
> Maybe we can add the new API to the pulsar-client-original module? like we
> currently do.
>
> ```
> PulsarClientImpl.builder()...
> ```
>
> We only changed the default value of the thread pool. Users still have the
> ability to change the threads
> that they want to assign. So if they want to use multiple client instances,
> they can also change the threads
> options.
>
> Thanks,
> Penghui
>
> On Tue, Dec 27, 2022 at 8:35 PM PengHui Li <peng...@apache.org> wrote:
>
> > Ah, got it.
> >
> > It's a good idea for users to be aware of all shared resources.
> > I will change the proposal as per your suggestion
> >
> > Thanks,
> > Penghui
> >
> > On Tue, Dec 27, 2022 at 7:11 PM Enrico Olivelli <eolive...@gmail.com>
> > wrote:
> >
> >> I generally support this proposal,
> >> this is a problem we have in the Proxy and I have seen it on
> >> applications that need to connect to multiple different tenants
> >> and they need different authentication parameters, so they have to
> >> create many PulsarClient instances.
> >>
> >> I have a suggestion:
> >>
> >> Exposing all the internals is a good idea for very advanced users,
> >> but I believe that we should provide some simpler support.
> >>
> >> We should have an API to allow sharing resources among multiple
> >> clients without entering the details.
> >>
> >> Interface PulsarClientGroup {
> >>    ... put here all the sharable things in the current version...
> >> }
> >>
> >> PulsarClient client = ....newClient().
> >>      .withSharedResources(pulsarClientGroup)
> >>      ...
> >>
> >>
> >> I think that having a PulsarClientGroup is a good choice for future
> >> evolutions
> >> because the internal thread pools may change: removed/added/change the
> >> purpose.
> >>
> >> If we require users to deal with all the possible sharable resources
> >> then we have a few risks:
> >> - people can "forget" to share some resources
> >> - upgrading the client may lead to not taking into account some new
> >> "shareable" resources
> >>
> >> This is way I believe that we should provide an opaque
> >>
> >> Enrico
> >>
> >> Il giorno mar 27 dic 2022 alle ore 11:07 PengHui Li
> >> <peng...@apache.org> ha scritto:
> >> >
> >> > Hi all,
> >> >
> >> > As discussed at
> >> > https://lists.apache.org/thread/5obfm17g58n3dnbzyxg57vokgmwyp6hx
> >> > I have created this proposal to support shared thread pool across
> >> multiple
> >> > client instances
> >> > Here is the proposal link https://github.com/apache/pulsar/issues/19074
> >> >
> >> > Please help take a look, and look forward to your suggestions.
> >> >
> >> > Thanks,
> >> > Penghui
> >> >
> >> > --------------------------------------------------
> >> >
> >> > ### Motivation
> >> >
> >> > The Pulsar client mainly has three thread pools that cooperate with each
> >> > other to complete the message publishing and consumption of messages.
> >> >
> >> > - IO threads - Used for handling network packets from the broker
> >> > - Internal threads - Used for handling internal tasks such as moving the
> >> > received messages to the internal receiver queue and pulling out the
> >> > message from the receiver queue to return to users. And the Java client
> >> is
> >> > optimized by the lock-free principle; each consumer will use a pinned
> >> > internal thread to reduce the lock overhead.
> >> > - External threads - Used by the message listener
> >> >
> >> > All the above thread pools will be created automatically after a Pulsar
> >> > client instance has been created.
> >> >
> >> > But for some cases, users need to create multiple Pulsar client
> >> instances
> >> > in a JVM process due to different authentications or others. Each client
> >> > will have exclusive thread pools, which will cause unreasonable thread
> >> > usage, waste memory, and potential performance degradation.
> >> >
> >> > It is not a serious problem for previous releases with the default
> >> > configurations because the thread pool will only have 1 thread by
> >> default.
> >> > But it also doesn't make sense that we only have one thread for each
> >> thread
> >> > pool. We have discussed this part under this [thread](
> >> > https://lists.apache.org/thread/5obfm17g58n3dnbzyxg57vokgmwyp6hx)
> >> >
> >> > So this proposal will provide a new possibility for users that require
> >> > multiple Pulsar client instances in one JVM process to use the shared
> >> > thread pools across multiple Pulsar client instances.
> >> >
> >> > ### Goal
> >> >
> >> > Provide public API to use the shared thread pool across multiple Pulsar
> >> > client instances in one JVM process
> >> >
> >> > - IO threads
> >> > - Internal threads
> >> > - External threads
> >> >
> >> > BTW, we already have such an ability internally. It was just hidden for
> >> > users. Please take a look at #12037 and #13839 to get more details.
> >> >
> >> > ### API Changes
> >> >
> >> > The following APIs will be introduced to the Java Client when creating a
> >> > Client instance
> >> >
> >> > ```java
> >> > PulsarClient.builder()
> >> >       .eventLoopGroup(ioEventLoopGroup)
> >> >       .internalExecutorProvider(sharedInternalExecutorProvider)
> >> >       .externalExecutorProvider(sharedExternalExecutorProvider)
> >> >       .scheduledExecutorProvider(sharedScheduledExecutorProvider)
> >> > ```
> >>
> >

Reply via email to