시스템 설계 및 아키텍처
수평 확장 (horizontal scaling) 과 수직 확장 (vertical scaling) 의 차이점을 설명해주세요.
답변:
수평 확장은 리소스 풀에 더 많은 머신을 추가하는 것 (예: 서버 추가) 을 포함합니다. 수직 확장은 기존 머신의 용량을 늘리는 것 (예: 단일 서버에 CPU 또는 RAM 추가) 을 포함합니다. 수평 확장은 더 나은 내결함성과 탄력성 때문에 웹 애플리케이션에 일반적으로 선호됩니다.
로드 밸런서 (load balancer) 란 무엇이며 시스템 설계에서 왜 중요한가요?
답변:
로드 밸런서는 들어오는 네트워크 트래픽을 여러 서버에 분산시킵니다. 단일 서버가 병목 현상을 일으키는 것을 방지하고 장애 조치 메커니즘을 통해 높은 가동 시간을 보장함으로써 애플리케이션 가용성, 확장성 및 성능을 향상시키는 데 중요합니다.
CAP 정리에 대해 설명해주세요. 분산 시스템에 대한 시사점은 무엇인가요?
답변:
CAP 정리는 분산 데이터 저장소가 일관성 (Consistency), 가용성 (Availability), 파티션 내성 (Partition Tolerance) 세 가지 속성 중 두 가지만 보장할 수 있다고 말합니다. 분산 시스템에서는 항상 파티션 내성을 고려해야 하므로, 네트워크 파티션이 발생했을 때 일관성과 가용성 사이에서 선택해야 합니다. 웹 애플리케이션의 경우, 종종 강력한 일관성보다 가용성을 우선시합니다.
관계형 데이터베이스 대신 NoSQL 데이터베이스를 사용하는 경우는 언제인가요?
답변:
NoSQL 데이터베이스는 대량의 비정형 또는 반정형 데이터를 다루거나, 높은 확장성이 필요하거나, 유연한 스키마가 필요하거나, 매우 높은 읽기/쓰기 처리량이 필요한 경우에 선호됩니다. 관계형 데이터베이스는 복잡한 쿼리, 강력한 ACID 보장, 잘 정의된 관계를 가진 구조화된 데이터에 더 적합합니다.
최종 일관성 (eventual consistency) 이란 무엇이며, 어디에 일반적으로 적용되나요?
답변:
최종 일관성은 충분한 시간이 주어지면 분산 데이터 항목에 대한 모든 업데이트가 시스템 전체에 전파되고 모든 복제본이 결국 일관성을 갖게 되는 일관성 모델입니다. 이는 DNS, Amazon S3 및 많은 NoSQL 데이터베이스와 같이 즉각적인 일관성이 중요하지 않은 고가용성 대규모 분산 시스템에 일반적으로 적용됩니다.
분산 시스템에서 세션 관리 (session management) 를 어떻게 처리하나요?
답변:
분산 시스템에서는 세션을 개별 서버에 저장해서는 안 됩니다. 일반적인 접근 방식으로는 중앙 집중식 세션 저장소 (예: Redis, Memcached) 사용, 데이터베이스에 세션 저장, 또는 각 요청과 함께 전달되는 토큰 자체에 세션 데이터를 인코딩하고 서명하는 상태 비저장 JWT(JSON Web Tokens) 사용 등이 있습니다.
캐싱 (caching) 의 개념과 웹 애플리케이션에서의 이점을 설명해주세요.
답변:
캐싱은 자주 액세스되는 데이터를 사용자 또는 애플리케이션에 더 가까운 더 빠른 임시 저장 계층에 저장하는 것을 포함합니다. 이점으로는 데이터베이스 부하 감소, 응답 시간 단축, 확장성 향상, 그리고 원본 소스가 아닌 메모리 또는 로컬 캐시에서 데이터를 제공하여 네트워크 지연 시간 감소 등이 있습니다.
CDN(Content Delivery Network) 이란 무엇이며, 어떻게 성능을 향상시키나요?
답변:
CDN 은 프록시 서버와 데이터 센터의 지리적으로 분산된 네트워크입니다. 정적 콘텐츠 (이미지, CSS, JS) 를 최종 사용자에게 더 가깝게 캐싱하여 성능을 향상시키고, 지연 시간을 줄이며, 원본 서버의 트래픽을 오프로드하고, 전 세계적으로 더 빠른 콘텐츠 전달을 제공합니다.
시스템 설계에서 메시지 큐 (예: Kafka, RabbitMQ) 의 목적을 설명해주세요.
답변:
메시지 큐는 시스템의 다른 부분 간의 비동기 통신을 가능하게 합니다. 서비스를 분리하고, 피크 로드 중에 요청을 버퍼링하며, 실패한 작업을 재시도하여 내결함성을 개선하고, 소비자 (consumer) 가 일시적으로 사용할 수 없더라도 안정적인 데이터 전달을 보장하는 이벤트 기반 아키텍처를 촉진합니다.
마이크로서비스란 무엇이며, 장점과 단점은 무엇인가요?
답변:
마이크로서비스는 애플리케이션이 작고 독립적인 서비스들의 모음으로 구축되는 아키텍처 스타일로, 각 서비스는 자체 프로세스에서 실행되며 경량 메커니즘을 통해 통신합니다. 장점으로는 독립적인 배포, 확장성, 기술 다양성이 있습니다. 단점으로는 운영 복잡성 증가, 분산 데이터 관리의 어려움, 그리고 더 복잡한 디버깅 가능성이 있습니다.
갑작스러운 트래픽 급증 (예: 플래시 세일) 을 처리하기 위한 시스템을 어떻게 설계하시겠습니까?
답변:
트래픽 급증을 처리하기 위해 컴퓨팅 리소스에 대한 자동 확장을 구현하고, 로드 밸런서를 사용하며, 캐싱 (CDN, 인메모리 캐시) 을 광범위하게 활용하고, 중요하지 않은 작업의 비동기 처리를 위해 메시지 큐를 사용하며, 데이터베이스가 고가용성 및 읽기/쓰기 용량을 위해 샤딩 (sharded) 또는 복제 (replicated) 되도록 보장할 것입니다. 속도 제한 (rate limiting) 및 서킷 브레이커 (circuit breaker) 도 과부하를 방지할 수 있습니다.
마이크로서비스 간의 동기식 (synchronous) 통신과 비동기식 (asynchronous) 통신 간의 차이점은 무엇인가요?
답변:
동기식 통신 (예: REST API 호출) 은 클라이언트가 서비스로부터 응답을 기다리는 것을 포함하며, 이는 긴밀한 결합 (tight coupling) 으로 이어집니다. 비동기식 통신 (예: 메시지 큐, 이벤트 스트림) 은 클라이언트가 메시지를 보내고 즉각적인 응답을 기다리지 않고 처리를 계속할 수 있게 하여, 느슨한 결합 (loose coupling), 복원력 및 확장성을 촉진합니다.