우연히 고가용성의 확장 가능한 시스템 설계에 대한 공고를 보고 고가용성의 확장 가능한 시스템은 어떤 시스템인지 고민을 시작했습니다.
어떤 Application 이 특히 java engineer로서 어떤 java 프로그램이 고가용성의 확장 가능한 시스템인지 이론적인 이야기가 아니라 진짜 어떻게 구현해야하는건지 고민해보고 있습니다.
구글에 ‘고가용성의 확장성 있는 시스템’ 이라고 검색하면 네이버 기술 블로그가 가장 상단에 보이네요.
네이버 기술 블로그의 글도 aosabook 이라는 오픈소스의 “Scalable Web Architecture And Distributed Systems” 라는 글을 번역한 글입니다.
시스템을 설계할 때 6가지(가용성/성능/신뢰성/확장성/관리성/비용)를 고려해야한다고 합니다.
내용을 비추어보면 현재 맡고 있는 시스템은 잘 설계된 시스템이라고 보기 어렵겠네요.
특히 관리성, 확장성 부분에서 하나를 수정하면 어디서 잘못될지 몰라 전전긍긍해야하는게 잘 설계된 시스템이라고 보기는 힘든것 같습니다.
그런점에서 우연한 호기심에서 시작했지만, 계속 공부해서 리팩토링으로 연결시켜 나간다면 제 커리어에 큰 milestone을 만들어 볼 수 있지 않을까 생각해봅니다.
잠깐 이야기가 빠졌습니다.
확장성 있는 시스템을 설계하기 위해서는
- 외부와 인터페이스가 가능한 기능별 서비스를 설계(SOA)
- 장애에 대응하기 위한 이중화 서비스
-> 인프라적인 측면 뿐만 아니라 application 에서도 핵심 기능은 여러 개가 동시에 동작하도록 하는 것이 필요 - read에 관해서는 캐시,프락시, 인덱스, 그리고 로드 밸런서 활용하여 속도를 높임
- write 에 관해서는 큐를 사용
-> 처리해야 할 일이 인입되면 그것은 큐에 쌓이고, 워커가 일을 처리할 수 있는 상황이 되면 워커 자신이 할 일을 큐에서 꺼내어 처리
-> 클라이언트 입장에서는 요청이 큐에 잘 쌓였다는 응답만 받고 비동기적으로 작업 진행 가능(클라이언트의 비동기적 동작 가능)
-> 현재 담당하고 있는 시스템에서의 큐는 어떻게 관리되고 있는지 확인해보자(클라이언트의 속도 향상을 위해 비동기적으로 사용되고 있는가?)
대량의 데이터에 빠르게 액세스할 수 있는 효율적인 시스템을 설계하는 것은 흥미있는 일
결론.
고가용성의 확장성 있는 시스템이란 장애에 대응하고 확장성이 높은 서비스를 기반으로
캐시,프록시, 인덱스, 로드밸런서를 활용하여 빠른 read 속도와 신뢰성 있는 응답을 보장하며 큐를 활용하여 write 성능까지 보장할 수 있는 시스템입니다.
캐시,프록시, 인덱스, 로드밸런서, 큐 에 대해서는 시간될 때 마다 하나씩 공부할 필요가 있을 것 같습니다.
추가로 java application 관점에서 가용성,확장성,관리성 을 보장할 수 있는 application 설계방법도 고민해봐야겠습니다.
참고 : https://d2.naver.com/helloworld/206816
http://aosabook.org/en/index.html (나중에 읽어보자..)