- 비동기 통신을 적용하면 클라이언트와 서버 사이에 계층이 하나 끼어든다.
- 클라이언트가 서버에 요청할 것이 생기면, 서버에 직접 요청을 보내는 대신 큐에 요청을 보낸다.
- 서버는 큐를 주시하다가 메시지를 수신하고 처리한다.
- 처리가 끝나면 서버는 응답 메시지를 큐로 보낸다.
- 클라이언트가 응답을 필요로 하는 상태라면 큐를 주시하며 서버가 보낸 메시지를 수신할 것이다.
- 서버가 다운되거나 기능이 완전하지 않을 때도 서버의 기능이 회복될 때까지 메시지는 메시지 큐에 대기한다.
- 응답 처리 시간이 오래 걸리더라도 클라이언트나 메시지 큐에는 아무 영향을 미치지 못한다.
비동기 메시징 통신 과정
- 통합 아키텍처를 설계할 때 메시징은 아주 매력적인 수단이다.
- 경량 컨테이너에서 메시지 큐를 실행하면 애플리케이션마다 별도의 전용 메시지 큐를 둘 수 있다.
- 레디스는 그중에서도 매우 널리 쓰이는 기술
실습 컨테이너로 레디스 서버를 실행하라. 이 컨테이너는 도커 네트워크에 접속돼 다른 컨테이너와 메시지를 주고받을 수 있어야 한다.
001) # 도커 네트워크 생성하기(리눅스 컨테이너)
002) ➜ docker network create ch21
003)
004) # 레디스 서버 실행하기
005) ➜ docker container run -d --name redis --network ch21 diamol/redis
006)
007) # 서버가 정상적으로 실행됐는지 확인하기
008) ➜ docker container logs redis --tail 1
009) 1:M 20 Aug 03:13:55.843 * Ready to accept connections
- 005: 레디스 컨테이너를 실행한다. 포트가 외부로 노출되지 않았으므로 이 메시지 큐는 컨테이너끼리만 사용할 수 있다.
-
009: 레디스를 실행하면 로그가 기록된다. 마지막 로그는 클라이언트를 받을 준비가 끝났다는 뜻이다.
-
메시지 큐는 일반적으로 고도로 최적화된 전용 통신 프로토콜을 갖추고 있다.
- 이 프로토콜에 따라 클라이언트는 메시지를 보낸 후 큐의 수신 확인을 기다린다.
- 메시지 큐 시스템은 메시지에 복잡한 가공을 하지 않으므로 어렵지 않게 초당 수천 건의 메시지를 처리할 수 있다.
실습 초당 수천 개까지는 아니지만, 레디스 명령행 도구를 통해 메시지를 보내 보겠다. 명령 문법이 조금 어렵게 보이지만, channel21이라는 채널에 메시지 'ping'을 보내는 간단한 명령이다. 그리고 5초에 한 번씩 같은 메시지를 50번 반복적으로 전송한다.
001) # 레디스 클라이언트를 백그라운드로 실행해 메시지를 전달한다
002) ➜ docker run -d --name publisher --network ch21 diamol/redis-cli -r 50 -i 5 PUBLISH channel21 ping
003)
004) # 메시지가 보내지는지 로그를 통해 확인한다
005) ➜ docker logs publisher
006) 0
007) 0
008) 0
009) 0
- 002: 레디스 명령행 도구는 레디스 전용 프로토콜을 사용한다. 5초에 한 번씩 50번의 메시지를 보낼 것이다.
-
005~009: 그리 대단한 내용은 없다. 명령행 도구에서 찍히는 응답 코드 0이 출력되고 있다.
-
메시지 큐 환경에서 모든 컴포넌트는 메시지 큐의 클라이언트가 된다.
- 메시지를 보내는 컴포넌트는 퍼블리셔(publisher)
- 메시지를 받는 컴포넌트는 서브스크라이버(subscriber)
- 다양한 시스템이 메시지 큐를 이용할 수 있으므로 채널(channel)을 나눠 메시지를 구분한다.
실습 다른 레디스 명령행 도구 컨테이너를 실행하고 조금 전 메시지를 보낸 채널을 구독한다.
001) # 대화식 컨테이너를 실행해 채널을 구독하면 5초마다 한 번 씩 메시지를 전달 받는다.
002) ➜ docker run -it --network ch21 --name subscriber diamol/redis-cli SUBSCRIBE channel21
003) Reading message... (press Ctrl-C to quit)
004) 1) "subscribe"
005) 2) "channel21"
006) 3) (integer) 1
007)
008) 1) "message"
009) 2) "channel21"
010) 3) "ping"
- 002~006: 레디스 명령행 도구를 실행한 대화식 컨테이너에서 subscribe 명령을 실행한다. 처음 출력되는 내용은 채널을 새로이 구독한다는 내용이다.
-
008~010: 퍼블리셔 컨테이너가 메시지를 레디스에 보낼 때마다 같은 채널을 구독하는 서브스크라이버 컨테이너에도 메시지가 전달된다. 로그를 보면 channel21 채널에 ping'이라는 내용의 메시지가 출력됐다.
-
메시지 큐를 다루는 컴포넌트는 같은 큐 에서 메시지를 보내거나 받는 다른 컴포넌트의 존재를 알 수 없다.
- 이렇게 큐를 이용해 메시지 전달자와 수신자의 결합을 느슨하게 하는 방법으로 애플리케이션의 성능과 확장성을 개선할 수 있다.