いくつかの簡単なトリックでJavaマイクロサービスのパフォーマンスを改善する

こんにちは、Habr。「HighloadArchitect」コースの将来の学生のために、資料の翻訳



用意しました。また、「水平ストレージスケーリングのパターンとしてのレプリケーション」というトピックに関するオープンウェビナーにご招待しますレッスンでは、参加者は専門家と一緒にレプリケーションを分解します。これはデータベーススケーリング手法の1つであり、その意味と目的について話し合い、さまざまなタイプのレプリケーションの長所と短所を検討します。






Javaのマイクロサービスの優れている点は、マイクロサービスを使用して、多くの独立したコンポーネントから大規模で複雑なシステムを構築できることです。単一のアプリではなく、複数のウィジェットまたはサービスが作成されます。コンポーネントは、互いに独立してテスト、展開、および保守できます。したがって、レンガを1つ取り除いても、建物は完全には崩壊しません。





. Java, , . , .





Spring Boot — Java. , Spring Boot-.





:





  • External-service ( ): "" , HTTP.





  • Facade-service (): , external-service . .





  • Java 8





  • Jmeter 5.3





  • Java IDE





  • Gradle 6.6.1





, , , .





External service

Spring Initializer. , :





@RestController 
public class ExternalController { 
 
 @GetMapping(“/external-data/{time}”) 
 public ExternalData getData(@PathVariable Long time){ 
 try { 
 Thread.sleep(time); 
 } catch (InterruptedException e) { 
 // do nothing 
 } 
 return new ExternalData(time); 
 } 
}
      
      



ExternalServiceApplication



. https://localhost:8543/external-data/300





Facade service

Spring Initializer. : ExternalService



ExternalServiceClient



.





ExternalService



External Service externalServiceClient



.





@Service 
public class ExternalService { 
 
 @Autowired 
 private ExternalServiceClient externalServiceClient; 
 
 public ResultData load(List<Long> times) { 
 Long start = System.currentTimeMillis(); 
 LongSummaryStatistics statistics = times 
 .parallelStream() 
 .map(time -> externalServiceClient.load(time).getTime()) 
 .collect(Collectors.summarizingLong(Long::longValue)); 
 Long end = System.currentTimeMillis(); 
 return new ResultData(statistics, (end — start)); 
 } 
}
      
      



external service ExternalServiceClient



openfeign. HTTP- OKHttp :





@FeignClient( 
name = “external-service”, 
url = “${external-service.url}”, 
configuration = ServiceConfiguration.class) 
public interface ExternalServiceClient { 
 
 @RequestMapping( 
 method = RequestMethod.GET, 
 value = “/external- data/{time}”, 
 consumes = “application/json”) 
 Data load(@PathVariable(“time”) Long time); 
}
      
      



FacadeServiceApplication



  http://localhost:8080/data/1,500,920,20000.





:





{ 
 “statistics”: { 
 “count”: 4, 
 “sum”: 1621, 
 “min”: 1, 
 “max”: 920, 
 “average”: 405.25 
 }, 
 “spentTime”: 1183 
}
      
      



Jmeter 5.3.1 perfomance-testing.jmx .





:





URL-: http://localhost:8080/data/1,500,920,200 





Jmeter .





Jmeter

. , ExternalService



parallelStream()



. Stream API ForkJoinPool



. ForkJoinPool



. . - . , ForkJoinPool



1000.





-Djava.util.concurrent.ForkJoinPool.common.parallelism=1000
      
      



Jmeter .





Jmeter

, (throughput) 6 26 . . , . (average time) 9 . , HTTP-. :





@Configuration 
public class ServiceConfiguration { 
 
 
 @Bean 
 public OkHttpClient client() 
 throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, NoSuchProviderException { 
 
 
 okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder() 
 .sslSocketFactory(sslContext.getSocketFactory(), trustManager) 
 .hostnameVerifier((s, sslSession) -> true) 
 .connectionPool(new ConnectionPool(2000, 10, TimeUnit.SECONDS)) 
 .build(); 
 
 OkHttpClient okHttpClient = new OkHttpClient(client); 
 
 return okHttpClient; 
 }
      
      



, 2000 HTTP- 10 .





Jmeter

: 26 71 .





10 : 6 71 / , , (maximum time) 7 . , UI.





. , Tomcat application.properties



:





server.tomcat.accept-count=80
server.tomcat.max-connections=80 
server.tomcat.max-threads=160
      
      



"Connection refused" ( ) , 160.





Jmeter

71 94 . 29%. "Connection refused". 





15 6 94 / - . , , AWS. , . — , .





Java-, . , . Java- .






"Highload Architect".





« ».








All Articles