Netflix는 전 세계적으로 2억 명 이상의 구독자를 보유한 세계 최대의 스트리밍 서비스입니다. 이 글에서는 Netflix의 전체 아키텍처와 API 성능 최적화 전략에 대해 자세히 알아보겠습니다.
이 게시물은 Netflix 엔지니어링 블로그와 오픈소스 프로젝트의 연구를 바탕으로 작성되었습니다. 혹시라도 잘못된 내용을 발견하시면 언제든지 알려주세요.
Netflix는 마이크로서비스 아키텍처를 기반으로 구축되어 있으며, 각 컴포넌트는 독립적으로 확장 가능하도록 설계되어 있습니다.

이미지 출처 - https://blog.bytebytego.com/p/ep64-how-to-improve-api-performance?utm_source=publication-search
Netflix는 대규모 트래픽을 처리하기 위해 다양한 API 성능 최적화 전략을 사용합니다.

이미지 출처 - https://blog.bytebytego.com/p/ep64-how-to-improve-api-performance?utm_source=publication-search
@GetMapping("/movies")
public Page<Movie> getMovies(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size
) {
return movieService.findAll(PageRequest.of(page, size));
}
장점:
@Slf4j
public class AsyncLogger {
private final BlockingQueue<LogEvent> logQueue;
public void log(LogEvent event) {
logQueue.offer(event); // 비동기로 로그 큐에 추가
}
private void processLogs() {
// 주기적으로 로그를 디스크에 플러시
List<LogEvent> batch = new ArrayList<>();
logQueue.drainTo(batch, 100);
flushToDisk(batch);
}
}
장점:
@Service
public class MovieService {
@Cacheable(value = "movies", key = "#id")
public Movie getMovie(Long id) {
return movieRepository.findById(id)
.orElseThrow(() -> new MovieNotFoundException(id));
}
@CacheEvict(value = "movies", key = "#id")
public void updateMovie(Long id, Movie movie) {
movieRepository.save(movie);
}
}
장점:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new GzipMessageConverter());
}
}
장점:
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/netflix");
config.setMaximumPoolSize(10);
config.setMinimumIdle(5);
return new HikariDataSource(config);
}
}
장점:
@Service
public class MovieService {
@CircuitBreaker(name = "movieService", fallbackMethod = "getMovieFallback")
public Movie getMovie(Long id) {
return movieRepository.findById(id)
.orElseThrow(() -> new MovieNotFoundException(id));
}
public Movie getMovieFallback(Long id, Exception e) {
return Movie.builder()
.id(id)
.title("서비스 일시 중단")
.build();
}
}
@Service
public class BatchService {
@Scheduled(fixedRate = 60000)
public void processBatch() {
List<Movie> movies = movieRepository.findAll();
movies.forEach(this::processMovie);
}
}
@Configuration
public class CdnConfig {
@Bean
public CdnService cdnService() {
return new CloudFrontService();
}
}
Netflix의 아키텍처와 API 성능 최적화 전략은 대규모 트래픽을 처리하는 분산 시스템의 모범 사례를 보여줍니다. 이러한 전략들은 다음과 같은 이점을 제공합니다:
이러한 전략들은 Netflix뿐만 아니라 대규모 트래픽을 처리해야 하는 다른 서비스에서도 참고할 만한 가치가 있습니다.