Hi all, Currently we have a `ServiceUrlProvider` interface to configure when constructing a PulsarClient in `ClientBuilder#serviceUrlProvider`. >From the beginning, I thought the `getServiceUrl` method is called each time the service URL is used, e.g. topic metadata lookup. However, the `getServiceUrl` method is only called when constructing the PulsarClient object. To update the PulsarClient's internal service URL, `PulsarClient#updateServiceUrl` must be called. Therefore, if we want to implement a `ServiceUrlProvider` that retrieves the latest service URL from a database, I have to implement it like:
```java class DataBaseServiceUrlProvider implements ServiceUrlProvider { private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); @Override public void initialize(PulsarClient client) { executor.schedule(() -> { try { client.updateServiceUrl(readServiceUrlFromDB()/* a fake method */); } catch (PulsarClientException e) { throw new RuntimeException(e); } }, 1, TimeUnit.SECONDS); } @Override public String getServiceUrl() { return "pulsar://localhost:6650"; } @Override public void close() { executor.shutdown(); } } ``` The key point is, if we didn't call `client.updateServiceUrl` and only modified the returned value of `getServiceUrl` periodically, the internal service URL would never be updated. Based on the provider above, the following two code snippets could be nearly the same. ```java var client = PulsarClient.builder().serviceUrlProvider(new DataBaseServiceUrlProvider()).build(); /* ... */ client.close(); ``` ```java var client = PulsarClient.builder().serviceUrl("pulsar://localhost:6650").build(); var provider = new DataBaseServiceUrlProvider(); provider.initialize(client); /* ... */ provider.close(); client.close(); ``` Obviously, the `ServiceUrlProvider` config is redundant. PIP-121 implements the `AutoClusterFailover` as the service URL provider. However, it also calls the following methods periodically: - PulsarClientImpl#updateAuthentication - PulsarClientImpl#updateTlsTrustCertsFilePath It's unnatural and intuitive to say a service URL provider could modify the internal states of `PulsarClient`, including: - the service URL - the authentication - the TLS trust certificate file - ... BTW, the implementation of PIP-121 [1] is different from the design [2]. [1] https://github.com/apache/pulsar/pull/13316 [2] https://github.com/apache/pulsar/issues/13315 Thanks, Yunze