Make sense to me

Enrico

Il giorno gio 26 mag 2022 alle ore 08:31 Yubiao Feng
<yubiao.f...@streamnative.io.invalid> ha scritto:
>
> I open a pip to discuss Auto release client useless connections, could you
> help me review
>
>
> ## Motivation
> Currently, the Pulsar client keeps the connection even if no producers or
> consumers use this connection.
> If a client produces messages to topic A and we have 3 brokers 1, 2, 3. Due
> to the bundle unloading(load manager)
> topic ownership will change from A to B and finally to C. For now, the
> client-side will keep 3 connections to all 3 brokers.
> We can optimize this part to reduce the broker side connections, the client
> should close the unused connections.
>
> So a mechanism needs to be added to release unwanted connections.
>
> ### Why are there idle connections?
>
> 1.When configuration `maxConnectionsPerHosts ` is not set to 0, the
> connection is not closed at all.
> The design is to hold a fixed number of connections per Host, avoiding
> frequent closing and creation.
>
> https://github.com/apache/pulsar/blob/72349117c4fd9825adaaf16d3588a695e8a9dd27/pulsar-client/src/main/java/org/apache/pulsar/client/impl/ConnectionPool.java#L325-L335
>
> 2-1. When clients receive `command-close`, will reconnect immediately.
> It's designed to make it possible to reconnect, rebalance, and unload.
>
> https://github.com/apache/pulsar/blob/72349117c4fd9825adaaf16d3588a695e8a9dd27/pulsar-client/src/main/java/org/apache/pulsar/client/impl/ConnectionHandler.java#L122-L141
>
> 2-2. The broker will close client connections before writing ownership info
> to the ZK. Then clients will get deprecated broker address when it tries
> lookup.
>
> https://github.com/apache/pulsar/blob/72349117c4fd9825adaaf16d3588a695e8a9dd27/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java#L1282-L1293
>
> ## Goal
> Automatically release connections that are no longer used.
>
> - Scope
>   - **Pulsar client**
> Contains connections used by consumers, Producers, and Transactions.
>
>   - **Pulsar proxy**
> Contains only the connection between Proxy and broker
>
> ## Approach
> Periodically check for idle connections and close them.
>
> ## Changes
>
> ### API changes
> **ClientCnx** added an idle check method to mark idle time.
>
> ```java
> /** Create time. **/
> private final long createTime;
> /** The time when marks the connection is idle. **/
> private long IdleMarkTime;
> /** The time when the last valid data was transmitted. **/
> private long lastWorkTime;
> /** Stat. enumerated values: using, idle_marked, before_release, released**/
> private int stat;
> /**
>   * Check client connection is now free. This method may change the state
> to idle.
>   * This method will not change the state to idle.
>   */
> public boolen doIdleCheck();
> /** Get stat **/
> public int getStat();
> /** Change stat **/
> public int setStat(int originalStat, int newStat);
> ```
>
> ### Configuration changes
> We can set the check frequency and release rule for idle connections at
> `ClientConfigurationData`.
>
> ```java
> @ApiModelProperty(
>         name = "autoReleaseIdleConnectionsEnabled",
>         value = "Do you want to automatically clean up unused connections"
> )
> private boolean autoReleaseIdleConnectionsEnabled = true;
>
> @ApiModelProperty(
>         name = "connectionMaxIdleSeconds",
>         value = "Release the connection if it is not used for more than
> [connectionMaxIdleSeconds] seconds"
> )
> private int connectionMaxIdleSeconds = 180;
>
> @ApiModelProperty(
>         name = "connectionIdleDetectionIntervalSeconds",
>         value = "How often check idle connections"
> )
> private int connectionIdleDetectionIntervalSeconds = 60;
> ```
>
> ## Implementation
>
> - **Pulsar client**
> If no consumer, producer, or transaction uses the current connection,
> release it.
>
> - **Pulsar proxy**
> If the connection has not transmitted valid data for a long time, release
> it.
>
>
> Yubiao Feng
> Thanks

Reply via email to