Stackoverflow.com 의 아키텍처
Stackoverflow는 110개의 Q&A 사이트를 운영합니다. 사용자는 430만 명, 질문은 760만 건, 답변은 1,360만 건입니다. 최근 30일 페이지뷰는 5.6억으로, 전년 대비 100% 성장 중입니다.
전체 서버는 25대 정도입니다. 웹서버 11대, 로드밸런서 1대(예비 1대 포함), DB서버 4대, 검색 서버(ElasticSearch) 3대, Redis 2대로 구성되어 있습니다. DB서버는 CPU 사용률을 10%로 유지하도록 두었고, 384GB RAM 정도가 효과가 있었다고 합니다. 웹서버도 CPU 사용률 10%에서 15% 사이를 유지하도록 운영하고 있습니다.
.NET 프레임워크 프로젝트는 9개입니다. Build, SocketServer, StackAuth, Stackoverflow, Api, Api v2, Mobile, Tests 등이고, 코드는 약 11만 줄입니다. 테스트 코드는 총 287개로 많지 않습니다. 대신 meta.stackoverflow.com에 먼저 적용해서 그곳의 유저들이 적극적으로 버그를 알려 주는 구조입니다. 빠르게 움직이고, 문제가 생기면 곧바로 고치는 방식입니다. 하루에 실서버에도 다섯 번씩 배포한다고 합니다.
거의 모든 계층에서 캐싱을 합니다. Network Level Caches(브라우저, CDN 등), Server Level Cache(HttpRuntime.Cache), Site Level Cache(Redis), SQL Server Database Cache(384기가의 RAM), 그리고 Solid State Disk까지 사용합니다.
캐싱을 위해 정적 메소드, 정적 클래스를 적극적으로 사용합니다. 이 부분은 정확히 이해가 되지 않지만, 대충 이해한 바를 적어 봅니다. 객체지향 관점에서는 그다지 좋은 방식이 아니지만, 성능이 좋기 때문에 채택했다고 합니다. 예를 들어 답변 리스트의 탭에는 active, oldest, votes의 세 가지가 있는데, 세 가지 탭을 위한 클래스 처리는 실제로 나노초 단위밖에 걸리지 않습니다. 그런데도 무조건 캐싱합니다. 클래스를 만들수록 가비지 컬렉터의 대상이 늘기 때문입니다. 그래서 클래스 복사본을 만들어 캐싱해 두고, 각 페이지에서 재사용하는 구조로 만들어 두었습니다.
개발자는 5명입니다. 성능을 위해 .NET 어셈블리 레벨까지 디어셈블해서 분석한다고 합니다.
슬라이드:
동영상:
p.s, 월 페이지뷰 5억 이상의 트래픽이 나오는 사이트가 DB 4대에 개발자 5명으로 운영된다는 점이 인상적입니다. 이 정도 트래픽이면 제가 봐 왔던 곳에서는 얼마나 많은 리소스를 썼을지 짐작이 잘 안 됩니다.