C10K
C10K는 Current 10 thousand clients 의 약자로 1만개의 클라이언트를 동시에 처리할 수 있는 네트워크 I/O 모델을 설계 방법을 묻는 말이다. 여기서 동시 처리의 기준이 되는 시간은 정확히 명시하지 않았지만, 보통은 1초를 뜻한다.
과거에는 하드웨어가 비싸고 스펙도 낮아서 수 많은 동시접속을 처리해야 하는 웹사이트를 구축함에 앞서 C10K 는 꼭 집고 넘어가야 하는 문제였다.
과거에 비해 하드웨어가 싸고 스펙도 좋아졌지만 과거에 비해 인터넷이 더 활성화된 지금 10만개 또는 100만개의 클라이언트를 처리해야 할 수 있기 때문에 이 문제는 여전히 유효하다.
그렇다면 네트워크 I/O 모델에는 어떤 것들이 있을까? 블로킹과 논블로킹, 동기와 비동기, 싱글스레드와 멀티스레드 방식이 존재한다. 각 방식에 대한 이야기는 여기 를 참고하자.
각 방식에 대해 알아보면 알겠지만 동시에 많은 요청을 처리하기 위해서 가장 이상적인 모델은 논블로킹/비동기 방식이다. 이러한 구성을 위한 I/O 모델은 OS 또는 언어에서 제공하는 것을 사용할 수 있는데 사용하는 언어가 C 기반이 아니라면 구현하는 것이 결코 쉽지 않다.
이에 언어별로 OS 커널 API를 포장한 라이브러리 또는 프레임워크를 사용하는 것이 일반적이고 Java에서는 NIO, NodeJS 에서는 libuv 가 이를 포장한 라이브러리에 해당한다.
그런데 소프트웨어 발전을 통해 더 많은 요구사항을 수용할 수 있게 되었고 이에 따라 네트워크 I/O 보다 내부 기능 로직이 더 많은 시간이 소요되는 경우가 있다.
이 경우 위에서 말하는 OS, 언어 단의 논블로킹/비동기 구현방식은 네트워크 I/O 처리방식을 개선해줄 뿐이기 때문에 이를 통해 네트워크 I/O 시간을 2초에서 1초로 단축시킨다고 하더라도 내부 기능 로직이 5초가 걸린다면 큰 의미가 없다는 말이다.
이 경우 효과를 볼 수 있는 것이 메시지큐이고 카프카가 대표적이다. Java 를 사용한다면 웹플럭스라는 프레임워크도 고려해볼 수 있는데 이게 카프카와 비슷한 개념인지 전혀 다른 개념인지 아직까지는 잘 모른다.
카프카는 어느정도 익숙하기 때문에 웹플럭스를 학습하면서 카프카와 많이 비교하면서 학습을 하게 될 것 같다. 만약 웹플럭스만으로 카프카 구성과 비슷한 효과를 볼 수 있다면 나는 지체없이 웹플럭스를 사용할 것이다.
개인적으로 라이브러리, 서드파티툴, 프레임워크 중에 선택하라면 프레임워크를 선택하는 것이 좋다고 생각한다. 관리포인트가 줄어 운영이 수월하고 최소한의 코딩컨벤션이 지켜지기 때문에 코드리뷰와 협업에 도움이 되기 떄문이다.
https://openwiki.kr/tech/c10k_problem
http://it.chosun.com/site/data/html_dir/2018/10/30/2018103002778.html
https://manhyuk.github.io/c10k-problem/
https://devsh.tistory.com/