2012-04-30 2 views
3

디스크에 파일을 쓰거나 데이터베이스에 다른 파일을 쓰는 웹 서비스가 있습니다. 전체 작업은 각 쓰기에 대해 1-2 초가 소요됩니다.Java에서 시간 초과/기아를 피하는 일반적인 방법은 무엇입니까?

서비스는 여러 클라이언트에서 동시에 호출 될 가능성이 거의 없습니다. 20 클라이언트가 동시에 웹 서비스를 호출한다고 가정 해 봅시다. 쓰기 작업은 동기화되어야합니다. 이 경우 일부 클라이언트는 많은 시간을 기다려야하기 때문에 시간 초과 예외가 발생할 수 있습니다.

이런 종류의 상황을 해결할 좋은 방법이 있습니까? 지금은 메서드가 동기화되어 기아/시간 초과가 발생할 수 있습니다.

synchronized 키워드를 제거하여 모든 스레드가 쓰기 메소드에 들어가도록하고 해당 작업을 작업 대기열에 넣어 시간 초과를 방지해야합니까? 이것이 바로 arount를 얻는 올바른 방법입니까?

+1

클라이언트가 고장난 것처럼 들립니다. 서비스가 정상적으로 몇 초가 걸리지 만 클라이언트 시간 초과가 발생하면 클라이언트가 너무 빨리 시간 초과됩니다. 또는 클라이언트가 곧 종료 될 예정이라면, 시간 초과는 정상이며 클라이언트는이를 우아하게 처리해야합니다. –

답변

1

synchronized을 제거하고 작업 대기열에 단독으로 배치하면 도움이되지 않습니다 (효과적으로 동기화가 수행하기 때문에). 그러나 대기열에 넣는 즉시 웹 요청에 응답하면 응답 시간은 줄어 듭니다. 그러나 사용자가 작업이 완료되고 작업이 실제로 완료되지 않았 음을 확인하기 때문에 (작업이 완료되기 전에 시스템이 중단 될 수 있으므로) 약간의 안정성을 희생해야합니다.

1

Francis Upton의 관행은 실제로 받아 들여지는 관행입니다.

또 하나, 더 세밀한 동기화를 만들고 있습니다. 클래스의 모든 읽기/쓰기 메소드를 동기화하는 대신, 동기화되어야하는 정확한 불변 변수의 액세스를 동기화 할 수 있습니다.

그럼에도 불구하고 더 나은 것은 동기화를 완전히 제거하는 것입니다. 이는 java.util.concurrent 패키지를 사용하여 가능합니다. 이 패키지는 Non-Blocking Algorithms을 사용하는 새로운 컬렉션을 소개합니다 (Compare-Ans-Swap 아토믹 지침을 사용하여 Java로 구현 됨). 이러한 컬렉션 (예 : ConcurrentHashMap)을 사용하면 크기 조정시 처리량이 훨씬 향상됩니다.

this article에서 자세한 내용을 볼 수 있습니다.

1

이러한 유형의 구현 (증가하는 부하에서 느린 서비스)에서는 시간 초과 처리 (서버 기반 인 경우) 및 필수 I/O를 포함하여 최대한 비동기 적으로 수행하려고합니다. 이러한 시간 소모적 인 작업 중 하나를 기다리지 않고 새로운 요청에 대한 서버의 응답 성을 유지하기 위해 클라이언트 응답 스레드를 대기시키지 말고 필요한 작업 (어쩌면 동적 스레드 풀)을 시작하고 콜백이 결과를 처리하게하고, 시간 초과, 전체 I/O 또는 오류 여부를 나타냅니다.

오류/시간 초과 메시지를 보내고 완료된 I/O가 도착하면 I/O를 롤백 할 준비가되어 있어야합니다 (I/O와 I/O 사이의 경쟁 조건으로 인해). 시간제 노동자). 이는 서버에서 트랜잭션 의미론이 필요함을 의미합니다.

로드가 커짐에 따라 점점 더 복잡해 지지만 초기에는 좋은 디자인으로 인해로드가 커짐에 따라 확장 할 수 있어야하는 영역입니다. 클라이언트 서비스 스레드가 전혀 차단되지 않는 것이 이상적입니다.

관련 문제