Quora 의 Backend 기술 정리

해외  지식인 사이트(?), QnA(?)  사이트의 끝판대왕…
바로 Quora인데요, 오늘은 이 Quora 사이트의 Backend 기술이 잘 정리된 글이 있어서 옮겨봅니다.

원문은 여기에서…

Quora 구축에 사용된 기술 및 툴들입니다.

  The Search-Box
Quora는 Full-text Search가 지원되지 않습니다.
라벨, 유저 아이디, 글제목 정도가 검색이 되는데요,
초기에는 Sphinx 라는 open source 검색 솔루션을 사용했는데요,
나중에는 in-house, 즉 Thrift 라이브러리를 이용해서 Python으로 자체 제작한 솔루션을 사용하게 됩니다.

  Webnode2 And LiveNode
컨텐츠 Management를 위한 내부 시스템으로 Webnode2와 LiveNode를 사용합니다.
Webnode가 Livenode와 찰떡 궁합이 되어 html, css, js 를 생성해 냅니다.

LiveNode 는 Python, C++, 그리고 JavaScript. jQuery , Cython 등으로 만들어졌습니다.

Amazon Web Services
아마존 EC2, S3 를 호스팅으로 사용합니다. 장기적으로 사용하기엔 비용이 싼 것은 아니지만,
빠르게 성장하는 Quora 같은 사이트에는 최적입니다.
Ubuntu Linux
Quora는 리눅스를 사용하고, 그 중에서 Ubuntu를 사용합니다.
이유는 Amazone EC2에 적용하기 좋고, 개발자들이 익숙해서..

  Static Content
정적 컨텐츠는 아마존에서 제공하는 DCDN(distributed content delivery network)
Cloudfront 를 사용하여 빠르게 서비스 되고 있습니다.
이미지, CSS, javascript 등이 모두 이 서버를 통해 서비스됩니다.
EC2에 올린 후에 파이선 API를 이용해서 S3 서버에 올립니다.

  HAProxy Load-Balancing
Nginx 서버들 앞단에 로드발란스로 Haproxy를 씁니다.
  Nginx
Haproxy 뒷단에서 Nginx가 각 서버들에 reverse-proxy  서버로 사용되고 있습니다.
고부하 서버에서의 Nginx를 reverse-proxy로 사용하기. 를 참고하세요.
  Pylons And Paste
Nginx 뒷단에서 가벼운 웹 프레임웤인 Pylons를 사용합니다.
Pylons과 함께 Paste도 같이 사용합니다.
  Python
Facebook을 창업한 친구들이  나와서 세운 회사로서
php가 익숙하고 편했을 텐데, Quora는 python을 주언어로 개발되었습니다.
Quora 설립자 Adam은 Facebook이 Php가 최고여서 선택한 것이 아니라
Facebook 자체가 이미 php로 쓰여져 있어서 바꿀 수 없는 거라고
말하고 있습니다. 당연히 새롭게 시작한 Quora에서는 대안을 생각했을 것이고
최종 결론은 Python이라는 것이죠.
Java보다 빠르고, Scala 보다는 안정기에 접어든 언어이고,
C# 은 MS 의존성이 너무 강하해서 제외~
Ruby와 함께 최종 고민햇으나 Python에 익숙하기에 결정했다고하네요.
느린 부분은 C++ 모듈로 직접 만들어 쓰고 있답니다.
Thrift
백앤드 시스템사이의 커뮤니케이션을 위해서 Thrift를 사용한다고 합니다.

Quora에서 Thrift를 사용한 케이스 입니다.
Mainly if you want to keep data in memory between requests, and want to keep your Python code stateless. Writing a Python wrapper around a C library involves some memory management with reference counting that requires some understanding of the Python internals, but writing a thrift interface is simple. You also isolate failures this way – if the service goes down it won’t take the Python code down with it.

  Tornado
Live Update를 위해서는 Tornado를 썻네요.
이게 그들의 Comet Server입니다.
Long polling, push 서버역할을 해서 실시간으로
유저에게 피드백을 주는 데 쓰죠.

Long Polling (Comet)  
Gmail, Meebo와 같이 실시간 업데이트를 위해서 Quora도 Long polling을
사용하여 Comet을 구현합니다. 단순한 polling보다는 훨씬 패킷량이 적게
comet 서버 운용이 가능한 장점도 있지만, 유져가 많이 붙었을 때 열려진
connection이 산술적으로 늘어난다는 단점이 있습니다. 100만이 붙으면
100만개의 connection이 열려 있는 것이죠. 전통적인 웹서버에서는 이 long polling의
connection이 메모리를 과하게 차지하여 부하가 많아지는 단점이 있었습니다.
근데, Nginx의 경우에는 Single-thread로 even-driven 방식으로 돌기 때문에,
이 connection의 메모리 부하를 최소화 시켜서 만여개의 동시 접속도 소화해
낼 수 있게 설계 되었습니다.
  MySQL
Quora는 요즘 한창 잘나가는 Nosql류를 사용하지 않습니다. (아직까지는)
대신 전통적인 RDB인 MySql을 사용합니다. Facebook과 마찬가지죠.
RDB를 어떻게하면 분산 DB로 만들어서 사용하는가?에대해서는
Ceo Adam이 쓴 글을 참고하시면 됩니다.
Partition your data at the application level
여튼 Quora는 Mysql을 Heavy하게 쓴다고 합니다.

Memcached
Mysql 의 caching-layer로써 memcached를 사용합니다.
Git
Source Version Controller로는 한참 유행하고 있고 제 블로그에도
다룬 Git을 씁니다.

Quora 사이트, 겉으로 보기에는 참 단순해 보이는데요,
내부적으로는 이렇게 많은 기술들이 연구되고 쓰였네요.

국내에서는 대기업들이 아직도 Java 일관이라 이런 다양한 기술을 시도하는 건
엄두를 못내겠지만 스타트업이나 중소기업에서 안정적인 기술들을 타당성 있게 검토해 도입한다면
새로운 바람을 불러 일으킬 수 있지 않을까 합니다.

개인적으로 구글도 잘 쓰고 있는 Python을 다시한번 보게되었고,
웹서버는 역시 대세 Nginx이라는 것~ ^^;

Quora 설립자이자 CEO인 Adam D’Angelo와 역시 공동 창업자인 Charlie Cheever
(생키, 너무 어리잖아… 하긴 주커버그 칭구랬지 -_-;)