*본 포스트는 성신여자대학교 [클라우드 컴퓨팅] 강의 기반으로 작성됨을 알립니다.
목차
1. 마이크로서비스 데이터 관리 - (1)
2. 마이크로서비스 간의 통신 - (1)
3. HTTP를 사용한 직접 메시징
4. 레빗MQ를 사용한 간접 메시징
3️⃣ HTTP를 사용한 직접 메시징
Chapter-5/example-2 - HTTP POST 메시지 수신
예제 repository : https://github.com/bootstrapping-microservices/chapter-5.git
HTTP POST 요청을 만든 코드이다. http.post에 대한 필요한 헤더/바디 부분을 설정하고 videoPath라는 변수에 매개변수를 받아서 history 마이크로서비스에 viewed 메시지를 post 요청으로 보낸다. 이때 요청을 보낼 URL은 http://history/viewed로, 대상 마이크로서비스를 특정한다.
video-streaming 마이크로서비스에서 POST 요청이 오면 body-parser를 통해 자동으로 JSON 형태를 인식하여 요청이 들어오면 insert를 하여 POST 요청을 처리한다.
위에서 업데이트한 application을 테스트한다.
- docker-composer 빌드로 application을 실행시킨다. (마이크로서비스 online 상태 확인)
- http에서 실제로 잘 동작하는지 확인한다. (http://<ip주소>:3001/video)
- DB에 접속해서 history 마이크로서비스의 데이터를 확인한다. (우측 사진을 보면 2개에서 4개로 늘어났는데 한 번 영상을 streaming할 때마다 해당경로에 대한 request와 파비콘 request 2개이기 때문에 2개씩 생성)
//application 실행
docker compose up --build
//history 데이터 확인
$ docker exec -it db bash
# mongo
> use history
> db.videos.find({})
- http://<IP주소>:3001/video → http에서 실제로 잘 동작하는지 확인
4️⃣ 레빗MQ를 사용한 간접 메시징
간접 메시징은 마이크로서비스 간의 "느슨한 연결"을 지원한다. 간접 메시징은 video-streaming과 history가 직접 통신하는 것이 아니라 RabbitMQ를 통해 viewed 메시지를 queue에 publish하고 hisory가 queue에서 viewed 메시지를 pull한다.
간접 메시징의 전체 flow는 아래 이미지와 같다.
- 송신 : DNS를 통해 RabbitMQ 서버의 특정 queue에 전송
- 수신 : History 마이크로서비스는 특정 queue로부터 viewed 메시지를 가져온다.
- 간접 메시징은 수신하는 마이크로서비스에게 더 나은 제어권을 부여한다. (과부하 상황에서 메시지를 loss하지 않고 queue에서 꺼내갈 수 있다.)
실습 repository : https://github.com/bootstrapping-microservices/chapter-5.git
1) RabbitMQ 서버 만들기
docker-compose.yml 파일에서 rabbit 도커 이미지를 활용하여 컨테이너를 만든다. 5672포트는 송수신에 사용할 포트이고 15672는 관리 대시보드 접근용 포트이다.
2) RabbitMQ 대시보드 살펴보기
대시보드 로그인 : guest / guest
대시보드에는 queue에 얼마나 많은 메시지가 쌓여있는지 얼마나 빠르게 전송되는지 등 상태를 확인할 수 있다. 대시보드 접근은 위 도커 컴포즈 파일에 대시보드 접근용 포트인 15672의 외부 포트인 300번 포트로 접근하면 된다.
$ cd example-3
$ docker compose up --build
3) 마이크로서비스의 message queue 연결
Histrory 마이크로서비스에서 Rabbit 환경변수를 활용해서 RabbitMQ에 접근한다.
4) history 마이크로서비스를 위해 docker-compose.yml 설정
docker-compose.yml 파일에서 rabbit 연결을 위해 amap라이브러리와 대시보드를 연결하고 db와 rabbit이 실행되기 전까지 history 마이크로서비스가 실행되지 못하도록 한다. (depends_on)
또한 RabbitMQ 서버가 준비가 안 된 상태에서 마이크로서비스가 연결을 하려고 하면 오류가 발생하기 때문에 RabbitMQ 서버가 준비가 됐는지 기다리는 명령어를 dockerfile에 추가한다. (wait-port 추가)
지금까지 RabbitMQ 서버와 환경변수, 에러처리 등을 설정해주었다면 queue를 어떻게 처리할지 뒤에서 두 가지 방식으로 설명한다. (단일 수신자 / 다중 수신자)
✅ 단일 수신자를 위한 간접 메시징
오직 하나의 마이크로서비스만이 메시지를 수신할 수 있는 방식이다. 작업을 마이크로서비스 풀에 "분배"할 때 유용하며 처리할 수 있는 첫 번째 마이크로서비스만이 처리한다.
1) 단일 수신자 메시지 받는 history의 코드
- 메시지를 가져올 때, Queue를 확보하기 (assert)
- 확보된 queue에서 메시지를 소비 (consume) - viewed에서 consumeViewedMessage를 꺼내서 소비
2) 단일 수신자 메시지를 보내는 video-streaming의 코드
이름이 viewed인 queue를 지정해서 json으로 변환한 jsonMsg를 버퍼에 넣어 publish 호출
단일 수신자 메시지 테스트 & RadditMQ를 통해 메시지 송수신이 잘 이루어졌는지 확인
✅ 다중 수신 메시지
하나의 마이크로서비스가 메시지를 보내면 다수의 마이크로서비스가 수신
1) 다중 수신자로 전송된 메시지 받기 (history)
- 단일 수신자와 다르게 queue를 확보하는 것이 아니라 Exchange(교환기)를 확보한다.
- anonymous(익명) queue를 확보한다.
- viewed 메시지와 익명 queue를 바인드하고 queue로부터 메시지를 읽어온다.
2) 다중 수신용 메시지 보내기 (video-streaming)
- viewed 큐 대신에 viewed exchange를 확보한다.
- viewed 큐 대신에 viewed exchange를 지정해 메시지를 publish한다. (첫 번째 인자가 exchange)
'Study > Cloud Computing' 카테고리의 다른 글
[Cloud] 컨테이너 오케스트레이션과 쿠버네티스 (2) - 실습 (0) | 2024.05.02 |
---|---|
[Cloud] 컨테이너 오케스트레이션과 쿠버네티스 (1) (0) | 2024.05.02 |
[Cloud] 마이크로서비스 간의 통신 (1) (1) | 2024.03.29 |
[Cloud] 마이크로서비스 데이터 관리 (2) (0) | 2024.03.28 |
[Cloud] 마이크로서비스 데이터 관리 (1) (1) | 2024.03.25 |