복붙노트

[SPRING] Spring MVC Rest Services - 스레드 수 (컨트롤러 인스턴스)

SPRING

Spring MVC Rest Services - 스레드 수 (컨트롤러 인스턴스)

우리의 애플리케이션에서 우리는 더 높은 처리량을 얻고 싶습니다. 그래서 스프링 MVC 컨트롤러에서 스레딩이 어떻게 작동하는지 알고 싶습니다.

도와 주셔서 미리 감사드립니다.

이것은 나를 도왔다.

http://community.jaspersoft.com/wiki/how-increase-maximum-thread-count-tomcat-level

해결법

  1. ==============================

    1.웹 응용 프로그램은 tomcat과 같은 응용 프로그램 서버에서 호스팅됩니다. 일반적으로 응용 프로그램 서버는 스레드 풀을 관리하며 모든 요청은 스레드에 의해 처리됩니다.

    웹 응용 프로그램은 tomcat과 같은 응용 프로그램 서버에서 호스팅됩니다. 일반적으로 응용 프로그램 서버는 스레드 풀을 관리하며 모든 요청은 스레드에 의해 처리됩니다.

    웹 응용 프로그램은이 스레드 풀에 대해 걱정할 필요가 없습니다. 스레드 풀의 크기는 응용 프로그램 서버의 매개 변수입니다.

    더 높은 처리량을 얻으려면 병목을 식별해야합니다.

    (제 경험에 따르면 응용 프로그램 서버의 스레드 풀 크기는 거의 성능 문제의 근본 원인이 아닙니다.)

    "컨트롤러 인스턴스 수"는 일반적으로 1입니다. 컨트롤러는 일반적으로 모든 스레드가 공유 / 사용하는 싱글 톤이므로 컨트롤러는 스레드로부터 안전해야합니다.

  2. ==============================

    2.우리가 조금 더 질문을 지정하자 : REST 컨트롤러를 구현하는 관심 대상 응용 프로그램이 일반적인 다중 스레드 응용 프로그램 서버에 배포됩니다 (가능하면 다른 것들도 실행 중임). Q : 컨트롤러의 매핑 된 메소드에 대한 개별 요청을 처리하는 데 동의가 있습니까?

    우리가 조금 더 질문을 지정하자 : REST 컨트롤러를 구현하는 관심 대상 응용 프로그램이 일반적인 다중 스레드 응용 프로그램 서버에 배포됩니다 (가능하면 다른 것들도 실행 중임). Q : 컨트롤러의 매핑 된 메소드에 대한 개별 요청을 처리하는 데 동의가 있습니까?

    필자는이 주제에 대해 권위가 없지만 특히 중요합니다 (단일 스레드 논리를 REST-Controller 코드에 적용해야합니까?).

    편집 : 아래의 답변은 잘못되었습니다. 동일한 컨트롤러의 다른 메소드에 대한 동시 호출은 동시에 처리되므로 사용하는 모든 공유 리소스 (서비스, 저장소 등)는 스레드 안전을 보장해야합니다. 그러나 어떤 이유로 컨트롤러와 동일한 메서드로 처리해야하는 호출이 직렬화됩니다 (또는 현재 나와 같은 것처럼 보입니다).

    아래의 작은 테스트는 컨트롤러의 매핑 된 메소드에 대한 후속 (및 급속) 호출이 실제로는 다른 스레드에 의해 처리 되더라도 단일 스레드 논리가 적용된다는 것을 나타냅니다 (즉, "즉시 사용할 수있는"기능 없음).

    컨트롤러를 가져 가자.

     AtomicInteger count = new AtomicInteger();
    
    @RequestMapping(value = {"/xx/newproduct"})
    @ResponseBody
    public Answer newProduct(){
        Integer atCount = count.incrementAndGet();
        ////// Any delay/work would do here
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Answer ans = new Answer("thread:" + Thread.currentThread().getName() + " controller:" + this, atCount);
        count.decrementAndGet();
        return ans;
    }
    

    REST 요청 (예 : 1000ms 슬립 시간과 거의 동시 발생)을 10 회 실행합니다. AngularJS 코드에 의해

    $scope.newProd = function (cnt) {
        var url = $scope.M.dataSource + 'xx/newproduct';
        for(var i=0; i<cnt; ++i) {
            $http.get(url).success(function(data){
                console.log(data);
            });
        }
    
    };
    

    (Answer에는 String과 Integer 만 있고, count static은 아무 것도 변경하지 않습니다). 어떤 요청이 발생하더라도 모든 요청이 동시에 보류 상태가되지만 응답은 순차적으로 정확히 1 분 간격으로 전달되며 아무도 1 분 미만으로 응답하지 않습니다. 그들은 서로 다른 스레드에서 왔습니다.

    보다 구체적으로 콘솔 로그에는 다음이 있습니다.

    다른 말로:

    편집 : 동일한 메소드 / 라우트에 대한 동시 호출이 직렬화됨을 보여줍니다. 그러나 우리가 쉽게 검증 할 수있는 컨트롤러에 두 번째 메소드를 추가하면이 메소드에 대한 호출이 첫 번째 메소드 호출과 동시에 처리되므로 요청을 처리하기위한 다중 스레드 로직은 필수 "필수" .

    그러므로 멀티 스레딩으로 이익을 얻으려면, 마치 사칭자와 같은 사소한 작업을 실행자 (runnable)로 시작하는 것과 같은 전통적인 명시 적 방법을 사용해야합니다.

  3. ==============================

    3.기본적으로 이것은 Spring과 아무 관련이 없습니다. 일반적으로 각 요청은 별도의 스레드로 분기됩니다. 따라서 여기서해야 할 일은 병목 현상을 찾는 것입니다. 그러나 스레드 경계를 통해 상태를 공유하고 동기화해야하는 잘못 작성된 bean은 매우 나쁜 영향을 미칠 수 있습니다.

    기본적으로 이것은 Spring과 아무 관련이 없습니다. 일반적으로 각 요청은 별도의 스레드로 분기됩니다. 따라서 여기서해야 할 일은 병목 현상을 찾는 것입니다. 그러나 스레드 경계를 통해 상태를 공유하고 동기화해야하는 잘못 작성된 bean은 매우 나쁜 영향을 미칠 수 있습니다.

  4. from https://stackoverflow.com/questions/33025587/spring-mvc-rest-services-number-of-threads-controller-instances by cc-by-sa and MIT license