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