Spring, CS 공부 내용 11

김정용·2025년 2월 10일

기술면접 공부

목록 보기
11/15
post-thumbnail

동기 방식으로 외부 서비스 호출시 외부 서비스에서 장애가 나면 어떻게 조치하나요?

외부 서비스에서 장애가 발생하게되면 해당 API 응답이 오는 시간이 지연되게 되고 대기하게되는 자원들이 서버 내부에 계속해서 쌓이게 된다.

이는 서비스의 성능면에서 큰 타격을 줄 수 있다.

그럼 어떻게 대비해야할까?

타임아웃

계속해서 자원들이 대기할 수는 없기에 이를 대비해야할 것이다.

그 방법 중 하나로는 타임아웃이 존재한다.

커넥션 타임아웃

서버와 외부 API 간의 연결(Connenction)을 맺는 시간을 제한하는 방법이다.

OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(5, TimeUnit.SECONDS) // 연결 시도 제한 시간
    .build();

연결 시도 제한 시간을 통해 타임아웃을 설정한다.

만약 API 서버 자체가 다운되었을때 빠르게 연결을 포기하고 이후 동작을 수행시킬 수 있다.

리드 타임아웃

데이터를 읽는데(Read) 걸리는 시간을 제한하는 방법이다.

서버 연결이 이루어지고 요청에 대한 응답이 오지 않는 경우 타임아웃이 발생한다.

OkHttpClient client = new OkHttpClient.Builder()
    .readTimeout(10, TimeUnit.SECONDS) // 데이터 수신 제한 시간
    .build();

연결은 되었지만 이후 데이터 수신이 중단된 경우 수행할 수 있다.

HTTP 커넥션풀 타임아웃

커넥션 풀 내에서 연결이 얼마나 오래 지속될지를 결정하는 방법이다.

OkHttpClient client = new OkHttpClient.Builder()
    .connectionPool(new ConnectionPool(10, 5, TimeUnit.MINUTES)) // 최대 10개의 유휴 연결을 5분 동안 유지
    .build();

빈번하게 API 호출이 발생하거나 반대로 API 호출 간격이 긴 경우 비효율적인 사용을 막기위해 유휴시간을 제한하면서 사용한다.

서비스 장애 case

A, B, C 서비스 연동 코드가 Http 커넥션 풀을 공유할때, A 서비스에서 생긴 장애로 응답시간이 지연된다면 B, C 에 대한 연동도 함께 대기하게 된다.

이 경우 풀에 남은 커넥션이 점점 줄어들어 대기 시간이 증가하게 된다.

이때, 적용해 볼 수 있는 방법으로 벌크헤드 패턴이 있다.

벌크헤드 패턴

기능의 종류마다 자원 사용을 분리해놓는 방법을 말한다.

자원을 격리함으로써 서비스의 장애가 다른 서비스로 전파되지 않음을 보장한다.

다른 커넥션 풀을 사용하도록 벌크헤드 패턴을 적용한다면 장애전파를 예방할 수 있다.

외부 서비스 장애가 계속 발생한다면?

외부 서비스 장애가 한번이 아닌 반복적으로 일어난다면 타임아웃에 의한 서비스 에러가 발생할 수 있다.

외부 서비스 장애가 발생 -> 운영서버에서의 지속된 요청 -> 응답시간 저해 -> 처리량 감소

이때는 서킷브레이커 를 통해 해결할 수 있다.

서킷브레이커

이름에서도 알 수 있듯 회로 차단기의 동작 원리에서 설계된 패턴이다.

서비스와 외부 API의 연동 상태를 추적하며 정상, 차단, 반개방 상태에 따라 다른 동작들을 수행하게 한다.

상태들은 호출 성공, 실패 횟수를 임계치와 비교해가며 변경한다.

FailFast(빠른 실패) 를 반환받아 장애상태에서 사용자가 기다려야하는 대기 시간을 줄일 수 있다.

마치며

명시적으로 모든 타임아웃을 설정하는 편이 좋다. 혹시 모를 부분에서 어떻게 대기가 발생하지 모르기에 무한대기를 피하기 위해 미리 대비해놓는편이 좋다.

추가로 서비스 별로 다른 특성이 있기에 그에 맞는 타임아웃 대비를 수행해야 한다.

대기를 피하는 방법도 존재하겠지만 일시적인 문제일 수도 있기때문에 재시도 로직을 구현하는 것도 좋은 방법이다.

참고

면접 질문 내용과 답변의 일부는 기술 면접 구독 서비스 - 매일메일 에 있다.
흥미로웠다면 구독해보는 것도 추천한다!

profile
누군가의 롤모델이 될 때까지😇

0개의 댓글