도서/IT 도서

[리뷰] Release의 모든 것(2판) - 대규모 웹 분산 시스템을 위한 운영 고려 설계

Chipmunks 2023. 12. 25.
728x90

 

장애 경험을 생생하게 느낄 수 있었습니다.

피부로 직접 겪었던 장애를 독자에게도 피부로 전달해줍니다.

다양한 장애 경험을 배울 수 있었습니다.

장애 경험으로 엔지니어로써 중요한 교훈을 얻을 수 있는 책입니다.

 

과거에 직접 엔지니어가 서버실에 근무하고 원격으로 터미널에 접속해 배포하는 시대는 말만 들어봤습니다.

개인 PC 한 대에서 서버를 가동하고 공유기 설정에서 포트 포워딩으로 서버 포트를 열어 줘 외부 IP 로 접속하는 경험만 있는데요.

대규모로 한 데이터 센터에 여러 서버실에 수 많은 서버들이 있고, 또 다른 데이터 센터에도 배포를 해야 했던 시대는 어땠을지 궁금하네요.

 

작중 초반부에 항공사 키오스크 서버의 장애를 예를 들었습니다.

조금 전에 언급한 클라우드가 없었던 시절의 이야기였는데요.

예전에는 장애를 어떻게 해결하고 사후 관리를 어떻게 하는지 생생하게 엿 볼 수 있던 장면이었습니다.

단순한 패킷 캡처부터 자바 애플리케이션의 스레드 덤프로 장애를 해결하는 과정도 소개합니다.

 

항공사와 관련한 몇 시간 동안의 장애는 결국 막대한 비즈니스 손해와 뉴스에까지 나오게 됩니다.

기업 입장에서 어마무시한 파급력을 지닌 이 장애는 결국 어떤 문제였을 지 감이 잡히실까요?

놀랍게도 사소한 자바의 예외처리 였습니다.

그것도 시중의 자바 입문서에도 적혀있는 코드인데요.

대부분의 사람들이 봐도 문제를 알아채리기 힘든 결함이 있는 코드입니다.

public List lookupByCit(...) throws SQLException, RemoteException {
	Connection conn = null;
    Statement stmt = null;
    try {
    	conn = connectionPool.getConnection();
        stmt = conn.createStatement();
        // 조회 로직 수행
        // 결과 리스트 반환
    } finally {
    	if (stmt != null) {
        	stmt.close();
        }
        if (conn != null) {
        	conn.close();
        }
    }
}

 

평범한 try ... finally 블록을 사용해 자원을 정리하는 의도가 담겨있습니다.

문제가 있는 코드 라인이 보이시나요?

바로 java.sql.Statement.close() 메소드 입니다.

해당 메소드가 SQLException 을 던질 수 있습니다.

대부분 일어나지 않지만, 오라클 드라이버는 연결을 닫으려는 IOException 을 만날 때 작동합니다.

작중에선 데이터베이스 서버를 중간에 다른 대체 서버로 교체하는 작업을 진행했습니다.

이전에 연결된 데이터베이스가 더이상 연결되지 않으므로 소켓에 데이터를 쓰면 IOException 이 발생하는데요.

그러나 놀랍게도 JDBC 연결은 여전히 Statement 객체를 만듭니다.

JDBC Connection 객체에서 Statement 를 생성하는 메소드에선 내부 상태만 확인한다고 합니다.

Statement 를 싱행하면 네트워크 입출력 작업에서 SQLException 이 발생하고, Statement 를 닫을 때도 데이터베이스 서버에 관련된 자원을 해제하도록 요청할 때 SQLException 이 발생합니다.

 

우리가 흔히 사용하는 표준 API 나, 라이브러리 또한 언제 어디서 결함이 발생할 지도 모른다.

위와 같이 라이브러리를 더욱 더 견고하게 만들었다면 장애가 발생하지 않았을지도 모르지만,

메소드 하나 하나 어떤 예외를 발생시키는지 사용자가 꼼꼼하게 확인하고 이를 적절한 예외 처리를 해야한다는 교훈을 얻었습니다.

Statement 를 닫을 때 예외가 발생하면 연결이 닫히지 않아 자원 누수가 발생하고 자원 풀은 고갈되며 이후 요청의 connectionPool.getConnection() 호출은 모두 블록됩니다.

처리되지 않은 하나의 SQLException 예외로 회사는 이미지 타격을 입었고 억 단위의 손실을 입었습니다.

 

고객에게 가치를 제공하는 서비스를 운영하고 유지보수 하다보면 이런 일이 비일비재하긴 합니다.

정말 사소한 실수 하나가 장애를 유발하게 되는데요.

라이브러리 버전업을 했을 때 이전과는 다른 동작으로 호환이 되지 않아 외부 서비스 통신에 장애가 생겨 서비스가 마비가 되기도 했습니다.

소규모로 서버를 운영하거나 언어를 배울 때는 몰랐지만, 많은 트래픽을 운영할 때 장애를 경험하고 나면

코드 한 줄, 한 줄을 작성하는 것도 굉장히 의식적으로 신경을 쓰게 되더라고요.

 

도서에서 이러한 장애 경험을 풍부하고, 또 생생하게 볼 수 있습니다.

선임 개발자들은 어떻게 해결을 했는지, 만약 내가 담당자라면 어떻게 장애를 분석하고 처리할지 고민해보는 맛이 있었습니다.

장애라는 주제는 소프트웨어 엔지니어라면 누구나 흥미있는 주제라고 생각을 합니다.

운영 체제단에서 네트워크 연결이 어떻게 동작하는지 등등 교과서에서만 봤던 CS 지식들을 실무에 맞게 설명한 것도 인상적이었어요.

개념을 설명할 때 삽화와 예시를 많이 들어 서술하는데요. 그래서 이론적인 내용들이 전혀 지루하지 않았었어요.

실제로 일어났던 경험담과 예전 기업에서 장애를 처리했던 경험담으로 지루할 틈이 없었습니다.

앞으로 소프트웨어 엔지니어로써 어떤 점을 고려해야 하는지 배울 수 있었고, 장애를 어떻게 대해야 하는지 교과서보다 더욱 교과서적으로 배울 수 있었습니다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

댓글