카테고리 없음

저스틴 비버 문제

Jueuunn7 2025. 1. 31. 17:52

저스틴 비버 문제란 인스타그램에 저스틴 비버가 게시글을 올릴 때마다 인스타그램 시스템 전체가 느려지거나 다운되는 현상을 말합니다.

이런 저스틴 비버 문제는 소수의 유명인들의 게시글이 몇 분만에 수백만개의 좋아요를 받으면서 발생하였습니다.

 

1. Justin Bieber 문제

이러한 문제는 인스타그램 초기에 좋아요 개수를 계산하는 방식에서 발생하였습니다.

인스타그램은 게시글을 조회시에 좋아요 수를 같이 조회하게 되어있습니다. 수억 명의 팔로워를 갖는 저스틴 비버의 게시글은 초당 엄청난 좋아요 개수 조회 요청이 발생하였습니다.

board

id title user
1 asdf 저스틴 비버

like

user board_id
홍길동 1

인스타그램은 원래 정규화된 좋아요 스키마를 사용해서 좋아요를 기록했습니다. 사용자가 좋아요를 누를 시 좋아요 테이블에 저장되었고, 좋아요 개수를 조회할 때엔 count를 동적으로 조회했습니다.

SELECT COUNT(*) FROM like WHERE board_id=1;

 

해당 쿼리는 일반적인 상황에서는 잘 작동합니다.

하지만 저스틴 비버가 사진을 업로드하면: 초당 수십만 수백만개의 좋아요 요청, 수천개의 댓글, 엄청난 수의 게시물 조회가 동시에 요청이 발생합니다.

이런 상황에서는 몇백만 개의 좋아요를 갖고 있는 게시글의 count를 계산할 때 서버에 높은 부하가 가해지고 좋아요 테이블에 행을 넣으면서 좋아요 테이블이 잠기며 작업이 지연되기도 했습니다. 이때 db 쿼리 응답시간만 100ms를 초과했습니다.

 

2.  해결

이러한 문제를 해결하기 위해서 인스타그램은 비정규화 방식을 채택했습니다.

게시글 테이블에 좋아요 수를 기록하는 컬럼을 추가하고 count 연산을 제거했습니다.

title user like_count
asdf 저스틴비버 10000

 

SELECT 좋아요수 FROM 게시글 WHERE id=123;

이렇게 비정규화를 하면 좋아요를 조회하기 위해서 매번 like 테이블에서 count 연산을 진행하지 않고 전체 좋아요 수를 board 테이블에 저장하였습니다. 그리고 update문을 사용해서 좋아요를 증가, 감소시켰습니다.

하지만 비정규화를 이용해서 인스타그램은 좋아요의 읽기 작업을 최적화했지만 좋아요를 누르는 작업에 대해서는 문제가 해결되지 않았습니다.

그래서 인스타그램은 배치 작업을 도입했습니다.

CREATE TABLE PendingLikes ( 
    board_id INT  NOT  NULL , 
    user_id INT  NOT  NULL
 );

 

트래픽이 많은 게시글에 경우에는 좋아요 수의 정확한 계산이 필요하지 않기 때문에 좋아요를 즉시 계산하지 않고 배치 작업을 통해서 like count에 대한 작업을 임시 테이블에 집계한 후에 업데이트하는 방식으로 진행했습니다.

또한 좋아요 수가 많은 게시글은 캐싱을 하여 조회기능을 개선하였습니다.