본문 바로가기
Study/Cloud Computing

[Cloud] 마이크로서비스 간의 통신 (1)

by sumping 2024. 3. 29.

 

*본 포스트는 성신여자대학교 [클라우드 컴퓨팅] 강의 기반으로 작성됨을 알립니다.

 
 

목차

1. 마이크로서비스 데이터 관리
2. 마이크로서비스 간의 통신
3. HTTP를 사용한 직접 메시징 - (2)
4. 레빗MQ를 사용한 간접 메시징 - (2)


1️⃣ 마이크로서비스 데이터 관리

 
각각의 마이크로서비스가 자신만의 데이터베이스를 가지도록 구성한다. (이때 DB의 이름은 마이크로서비스 이름과 동일하다.) 아래 실습은 video-streaming이 HTTP GET 요청을 받아 video-storage에 요청을 전달하는 마이크로서비스 간 통신이다. video-storage는 자신의 DB를 드러내지 않고 video-streaming에 서비스를 전달한다.
 
두 개의 마이크로서비스 구성 → 마이크로서비스 간 통신이 필요

  • video-streaming과 Database 연결
  • video-storage는 외부 클라우드 저장소와 연결
FlixTube v2.0 - 마이크로서비스끼리 통신이 필요

 

Chapter-4/example-3 - DB를 앱에 추가하기

1) 기존에서 추가된 점

docker-compose.yml 파일에 데이터베이스 컨테이너가 추가되어 있다. 그리고 DB 컨테이너를 사용하는 video-streaming 컨테이너에는 DB 마이크로서비스에 연결할 수 있는 환경변수를 추가로 설정한다.

docker-compose.yml

 
video-streaming 마이크로서비스에서는 db 모듈을 추가시켜 환경변수를 통해 DB에 접근하도록 설정한다. 또한 비디오 경로를 하드코딩하는 것이 아니라 비디오 ID를 통해 DB를 참조하도록 한다. 

video-streaming/index.js

 
테스트를 위해 수동으로 mongoDB에 데이터를 json 파일 형태로 업로드

db-fixture/videos

 

2) mongoDB에 데이터로딩을 위한 도구 설치 + build

mongoDB Database Tool → Ubuntu 22.04 x86_64
https://www.mongodb.com/docs/database-tools/installation/installation-linux/#installation
 

//데이터 로딩을 위한 도구 설치
$ cd ~
$ wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-x86_64-100.9.4.tgz
$ tar –zxvf mongodb-database-tools-ubuntu2204-x86_64-100.9.4.tgz
$ cd mongodb-database-tools-ubuntu2204-x86_64-100.9.4/bin
$ sudo cp * /usr/local/bin

//build하기
$ cd /home/rlawjd10eun/chapter-4/example-3
$ docker compose up --build
실습 화면

 

3) mongoDB에 접속하여 DB와 collection 생성 + 테스트

docker-compose 빌드와 동시에 다른 터미널로 mongodb에 접속하여 DB와 collection을 생성한다. (Collections은 RDBMS의 Tables와 같은 개념이다.)
 
DB와 Collections를 생성했으면 json 파일을 import해주고 video의 id로 업데이트한 앱을 테스트한다.
 

//mongodb에 접속
$ docker exec -it db bash
# mongo
> use video-streaming
> db.createCollection(“videos”)

//mongodb에 데이터 로딩 (json 파일 import)
$ mongoimport –h <VM 외부IP주소> --port=3002 –d video-streaming –c videos --type json --file db-fixture/videos.json

//테스트
http://<IP주소>:3001/video?id=5d9e690ad76fe06a3d7ae416

 

실습화면

 


2️⃣ 마이크로서비스 간의 통신

 
지금부터 할 실습은 시청자가 시청한 기록을 History 마이크로서비스에 메시지로 전송하는 것이다. History는 video-streaming으로터부터 메시지 스트림을 받아서 자신의 데이터베이스에 기록한다.

  • FLOW : 비디오를 시청 → video streaming이 "viewed"라는 메시지를 보낸다. → History는 메시지를 읽고 자신의 DB에 기록한다.
History 마이크로서비스 만들기

 
 

마이크로서비스 간의 통신 방법

  • 직접 메시징

하나의 마이크로서비스가 다른 마이크로서비스에게 "직접" 메시지를 보내고 "바로" 응답을 직접 받는다. 모든 과정을 동기적으로 처리한다. 또한 순차적 직접 메시지로 여러 개의 마이크로서비스를 대상으로 전체적인 "메시지 흐름을 조정하는 역할"을 수행할 수 있다. 즉, 하나의 마이크로서비스가 동작 순서를 제어한다.
 
장점 
명령 전송/동작 호출에 적합 (특정 마이크로서비스 이름으로 직접 전송)
메시지 처리에 대한 성공 여부 직접 확인 가능
순서대로(순차적 직접 메시지)
다수의 마이크로서비스를 대상으로 복잡한 동작을 조정할 때 유용
 
한계 → 한 번에 하나의 마이크로서비스만 (하나의 메시지를 여러 마이크로X), 마이크로서비스 간 느슨한 연결이 아니라 강력한(밀접한)연결 (한 서비스의 변경이 다른 서비스에 영향)

(좌) 직접 메시징 (우) 순차적 직접 메시징

 

  • 간접 메시징

마이크로서비스 간 중개자를 통해 느슨한 연결을 가진다.  직접 마이크로서비스들을 제어하지는 않지만 유연하고 확장성 있게 메시지 흐름을 관리한다. 즉, 마이크로서비스가 개별적으로 받은 메시지에 대해 어떻게 응할지는 수신한 마이크로서비스의 응답에 따라 생성한다.
 
특징
1:多 브로드캐스트 가능. (메시지 처리 성공 여부는 관심 X)
발신자와 수신자 서로 모르고 독립적으로 (자신의 속도에 맞춰서 처리하면 된다.)
queue에 요청이 있기 때문에 과부하 경우에, loss없이 성공할 때까지 기다리면 된다.
여러 병렬 처리 작업자에 대한 부하 균형