많은 현대 프로그래밍 프레임워크와 시스템들은 Task Queue와 Workers Pool을
기본적으로 구현하고 있습니다. 이들은 비동기적 작업 처리, 멀티스레딩, 분산 컴퓨팅과 같은
고급 기능을 효율적으로 관리하는 데 필수적인 요소들입니다.
이번 글에서는 이 Task Queue와 Workers Pool에 대해서 알아보도록 하겠습니다.
Task Queue + Workers Pool을 활용한 서버의 구조
Task Queue와 Workers Pool을 도입한 서버의 구조입니다.
- Socket 단에서는 I/O Multiplexing을 한 후 메시지를 뽑아낸 다음 Task Queue에 넣고 바로 빠집니다.
- 이 Task Queue에 들어간 메시지들을 다른 스레드가 핸들러를 호출해 처리합니다.
이때 메시지들을 처리하는 스레드는 Thread Pool에서 노는 Thread들이 처리합니다.
이 스레드들은 메시지를 뽑아서 이 메시지에 해당하는 핸들러를 호출합니다.
보통 프레임워크에서 이 작업을 다 해주지만 프레임워크는 일종의 식당에서 음식을 사 먹는 것입니다.
식당에서 음식을 다 해주기 때문에 손님입장에서는 사 먹는 것이 편하지만 이 식당이 망해버리면 식당을
직접 만들어야 합니다. 그래서 프레임워크를 잘 이해하려면 적어도 음식을 사 먹을 때 여기에
좋은 게 들어갔는지 나쁜 게 들어갔는지 알아야 할 필요가 있습니다. 그렇기 때문에 프레임워크에 전반적인 구조를 이해할 필요가 있습니다.
Task Queue + Workers Pool 구현 방식
이 Task Queue+Workers Pool 구조인 Worker는 스레드로 구현되거나 프로세스로 구현될 수 있습니다.
스레드를 이용해서 만들 때는 서버 프로세스를 한 개 띄우면 그 안에 여러 Worker Thread가 존재하는 구조가 됩니다.
같은 프로세스 안에 존재하기 때문에 이 구조는 메모리 스페이스를 공유합니다. 메모리 스페이스가 공유되기 때문에
같은 스레드가 데이터를 공유하기 위한 복잡한 과정을 거치지 않아도 되기 때문에 편리해서 이 방법을 많이 씁니다.
프로세스를 이용해서 만든다면 Worker별로 프로세스를 띄우는 방식으로 합니다. 스레드라는 것 대신 프로세스를 띄우는 방식입니다. 만약 Worker가 10개 필요하다면 10개 프로세스를 띄우게 됩니다. 이 방식은 Worker 별로 프로세스를 띄우기 때문에 Worker끼리 메모리 공유가 불가능합니다. 그래서 메모리 공유를 하기 위한 외부 프로세스를 사용해야 합니다. 그래서 Task Queue 역시 별도의 프로세스로 존재하게 됩니다. 이 방식에 대표적인 것이 RabbitMQ가 있습니다
'Tech' 카테고리의 다른 글
[Tech] Kafka? RabbitMQ? (0) | 2023.07.17 |
---|