본문 바로가기

ComputerScience/Database

[Database] 인스타그램의 Justin Bieber 문제

️Justin Bieber 문제

2024.02.29 오후 1시 기준 저스틴 비버의 인스타그램

Justin Bieber 문제는 인스타그램에서 저스틴 비버가 사진을 업로드할 때 마다 인스타그램이 다운되거나 매우 느려지는 현상을 말합니다.

이는 그 당시 인스타그램의 '좋아요' 수를 계산하는 방식 때문이었습니다.

 

인스타그램에서는 어떤 유저가 언제 어떤 사진에 '좋아요'를 클릭했는지 알 수 있습니다.

그래서 저스틴 비버의 팔로워들에게 그의 최신 사진을 표시할 때 해당 사진을 본 모든 사람에 대해 '좋아요' 수를 최신화된 수치로 보여주어야 했습니다. 

 

'좋아요' 수를 계산하기 위한 테이블로 다음과 같은 DB 테이블를 구성해보겠습니다.

Photos

id title user_id file_url
1 Photo A 2 http://example.com/photo1.jpg
2 Photo B 3 http://example.com/photo2.jpg
3 Photo C 1 http://example.com/photo3.jpg

Likes

photo_id user_id
1 1
1 3
2 2
3 1

위 테이블에서 사진의 '좋아요'수를 계산하려면, likes 테이블에서 그 사진의 대한 COUNT 쿼리를 실행시키면 됩니다. 

문제는 저스틴 비버의 수 억명의 사람들에게 '좋아요' 수를 보여주기 위해 많은 사람들이 사진을 좋아할수록 '좋아요' 수를 계산하는 쿼리를 발생시켜야 했기 때문에, 점차 쿼리를 완료하는 데 시간이 더 오래 걸렸습니다.

 

이에 따라 인스타그램은 Likes 테이블을 Denormalize를 하였습니다.

id title user_id file_url like_count
1 Photo A 2 http://example.com/photo1.jpg 120
2 Photo B 3 http://example.com/photo2.jpg 95
3 Photo C 1 http://example.com/photo3.jpg 1719

좋아요 수를 세기 위해 매번 Likes 테이블에서 '좋아요'를 카운트하지 않고, Photos 테이블에 새로운 열을 추가해 전체 좋아요 수를 저장했습니다. 이렇게 함으로써, 수만 개의 좋아요를 셀 필요 없이 사진 테이블에서 하나의 카운터만 유지하고, 좋아요 수를 증가 혹은 감소시켰습니다.

 

또 다른 솔루션에는

  • Caching: '좋아요'수를 저장하는 캐싱 DB를 둡니다.
  • Sharding: 샤딩을 통해 데이터를 분산시킵니다.

가 있겠습니다.

참고

https://www.youtube.com/watch?v=V27XkmVPqYQ