diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java index 6bc4b8544..c86b88b6b 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java @@ -22,8 +22,9 @@ import java.net.http.HttpClient; import java.net.http.HttpResponse; import java.time.Duration; import java.util.Optional; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.plugin.trafficmirroring.config.TrafficMirroringProperties; @@ -35,6 +36,7 @@ import com.tencent.polaris.api.plugin.route.RouterConstants; import com.tencent.polaris.api.utils.ClassUtils; import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.client.pojo.Node; +import com.tencent.polaris.client.util.NamedThreadFactory; import com.tencent.polaris.metadata.core.MetadataObjectValue; import com.tencent.polaris.metadata.core.MetadataType; import feign.Request; @@ -57,18 +59,12 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin { private final TrafficMirroringProperties trafficMirroringProperties; - private final ExecutorService executorService; + private ThreadPoolExecutor threadPoolExecutor; - private final HttpClient httpClient; + private HttpClient httpClient; public TrafficMirroringPostPlugin(TrafficMirroringProperties trafficMirroringProperties) { this.trafficMirroringProperties = trafficMirroringProperties; - this.executorService = Executors.newFixedThreadPool(trafficMirroringProperties.getRequestPoolSize()); - // create JDK HttpClient instance. - this.httpClient = HttpClient.newBuilder() - .connectTimeout(Duration.ofMillis(trafficMirroringProperties.getRequestConnectionTimeout())) - .executor(executorService) - .build(); } @Override @@ -116,17 +112,38 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin { return; } + initIfNeeded(); + byte[] body = context.getOriginBody(); - // async send mirroring request. - String finalDestination = destination; - executorService.submit(() -> { - try { - sendMirroringRequest(originalRequest, body, finalDestination); - } - catch (Exception e) { - LOG.warn("Traffic mirroring request failed.", e); + // send mirroring request. + try { + sendMirroringRequest(originalRequest, body, destination); + } + catch (Exception e) { + LOG.warn("Traffic mirroring request failed.", e); + } + } + + private void initIfNeeded() { + if (threadPoolExecutor == null) { + // create thread pool executor. + int cpuCores = Runtime.getRuntime().availableProcessors(); + int corePoolSize = cpuCores; + int maxPoolSize = trafficMirroringProperties.getRequestPoolSize(); + if (cpuCores > trafficMirroringProperties.getRequestPoolSize()) { + corePoolSize = trafficMirroringProperties.getRequestPoolSize(); } - }); + this.threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, + 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("polaris-traffic-mirroring")); + + } + if (httpClient == null) { + // create JDK HttpClient instance. + this.httpClient = HttpClient.newBuilder() + .connectTimeout(Duration.ofMillis(trafficMirroringProperties.getRequestConnectionTimeout())) + .executor(threadPoolExecutor) + .build(); + } } private void setHeaders(java.net.http.HttpRequest.Builder requestBuilder, Object originalRequest) { diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java index d3e38d79e..b4e12d773 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java @@ -33,9 +33,9 @@ public class TrafficMirroringProperties { private boolean enabled = true; /** - * Traffic mirroring request pool size. Default is 4. + * Traffic mirroring request pool size. Default is 100. */ - private int requestPoolSize = 4; + private int requestPoolSize = 100; /** * Traffic mirroring request connection timeout in millisecond. Default is 5000.