UNIX 시그널을 활용한 메시지 브로커 구현
이 글은 프로세스 간 통신(IPC)의 다양한 형태를 소개하며 시작합니다.
UNIX 시그널의 이해
-
SIGTERM,SIGKILL,SIGINT,SIGHUP,SIGQUIT,SIGSTOP,SIGCONT,SIGCHLD, 그리고 사용자 정의 시그널인SIGUSR1,SIGUSR2와 같은 주요 시그널의 역할과 특징을 설명합니다. -
루비의
trap메서드를 사용하여 시그널을 가로채 특정 동작을 수행하는 방법을 시연합니다.
시그널을 이용한 메시지 전송 아이디어
-
메시지를 문자열이 아닌 바이트의 시퀀스로 보고, 각 비트(0 또는 1)를
SIGUSR1또는SIGUSR2시그널로 매핑하여 전송하는 개념을 제시합니다. -
문자 ‘h’ (바이너리 01101000)를 예시로 들어, 시그널을 통해 비트를 전송하고 수신 측에서 이를 다시 문자로 디코딩하는 과정을 설명합니다.
바이너리 데이터 인코딩 및 디코딩
-
수신자(
receiver.rb): LSB(최하위 비트)부터 MSB(최상위 비트)까지 비트를 누적하여 하나의 바이트를 완성하고, 이를 ASCII 문자로 변환하는accumulate_bit메서드를 구현합니다. -
송신자(
sender.rb): 문자열을 바이트로 변환하고, 각 바이트에서 개별 비트를 추출((byte >> i) & 1)하여SIGUSR1또는SIGUSR2시그널로 전송하는 로직을 구현합니다. -
메시지 종료를 알리기 위해 NULL 종결자(0000 0000)를 사용하는 방법을 도입하여 여러 메시지를 구분할 수 있도록 개선합니다.
메시지 브로커 시스템 구축
-
SignalCodec모듈을 통해 비트 인코딩/디코딩 및 시그널 전송 로직을 캡슐화합니다. -
브로커: PID를 등록하고, 들어오는 시그널을 트랩하여 메시지를 디코딩한 후 큐에 저장합니다. 이후 등록된 소비자들에게 메시지를 라운드 로빈 방식으로 배포합니다.
-
소비자: PID를 등록하고, 브로커로부터 오는 시그널을 트랩하여 메시지를 디코딩하고 출력합니다.
-
생산자: 브로커 PID를 읽어 메시지를 인코딩하고 브로커에게 시그널로 전송합니다.
이러한 구성 요소를 통해 시그널만을 이용한 간단한 메시지 브로커 시스템이 완성됩니다.