본문 바로가기

24DAY 백엔드

24DAY 백엔드 - 21DAY 메시지 브로커

728x90

1. RabbitMQ

AMQP를 따르는 오픈소스 메시지 브로커인데, 메세지를 많은 사용자에게 전달하거나, 요청에 대한 처리 시간이 길 때, 해당 요청을 다른 API에게 위임하고 빠른 응답을 할 때 많이 사용합니다. 또한 MQ를 사용하여 애플리케이션 간 결합도를 낮출 수 있는 장점도 있습니다.

 

RabbitMQ에서 중요한 개념으로는 Producer, Consumer, Queue, Exchange, Binding이 있습니다.

 

2. kafka

아파치 재단의 카프카는 Pub-sub모델의 메세지 큐이고, 분산환경에 특화되어 설계되어 있다는 특징을 가짐으로써, 기존의 RabbitMQ와같은 메시지큐와의 성능 차이가 납니다. 그외에도 클러스터 구성, fail-over, replication와 같은 여러 가지 특징들을 가지고 있습니다.

 

Pub-Sub 모델

 

카프카는 pub-sub(발생/구독) 모델을 사용하기 때문에, 발행/구독모델이 뭔지 알아봅시다. pub-sub은 메세지를 특정 수신자에게 직접적으로 보내주는 시스템이 아닙니다. publisher는 메세지를 topic을 통해서 카테고리화 합니다. 분류된 메세지를 받기를 원하는 receiver는 그 해당 topic을 구독함으로써 메세지를 읽어 올 수 있습니다. 즉,publisher는 topic에 대한 정보만 알고 있고, 마찬가지로 subscriber도 topic만 바라봅니다. publisher와 subscriber는 서로 모르는 상태입니다. 

 

카프카의 구성요소 및 특징

  • topic, partiton
  • Producer, Consumer
  • broker, zookeepr
  • consumer group
  • replication

 

3. Docker

클라우드 또는 온-프레미스로 실행될 수 있는 이식 가능하고 문제를 스스로 해결할 수 있는 컨테이너로서 애플리케이션 배포를 자동화하기 위한 오픈 소스 프로젝트입니다. Docker는 Microsft를 비롯한 클라우드, Linux 및 windows 공급 업체와 협업하여 이 기술을 장려하고 발전 시키는 회사이기도 합니다.

위 다이어그램에 나와 있듯이 Docker 컨테이너는 고객 데이터 센터의 온-프레미스, 외부 서비스 공급자 또는 Azure의 클라우드에서, 어디서나 실행할 수 있습니다. 또한 Docker 이미지 컨테이너는 Linux 및 Windows에서 기본적으로 실행할 수 있습니다. 그러나 Windows 이미지는 Windows 호스트에서만 실행할 수 있고 Linux 이미지는 Linux 호스트 및 Windows 호스트(지금까지 Hyper-V Linux VM 사용)에서 실행할 수 있습니다. 여기서 호스트는 서버 또는 VM을 의미합니다.

개발자는 Windows, Linux 또는 macOS에서 개발 환경을 사용할 수 있습니다. 개발자는 개발 컴퓨터에서 앱 및 해당 종속성을 비롯하여 Docker 이미지가 배포된 Docker 호스트를 실행합니다. Linux 또는 Mac에서 작업하는 개발자는 Linux 기반의 Docker 호스트를 사용하고 Linux 컨테이너용 이미지만 만들 수 있습니다. (Mac에서 작업하는 개발자는 macOS에서 코드를 편집하거나 Docker CLI(명령줄 인터페이스)를 실행할 수 있지만, 이 작성 시 컨테이너가 macOS에서 직접 실행되지 않습니다.) Windows에서 작업하는 개발자는 Linux 또는 Windows 컨테이너용 이미지를 만들 수 있습니다.

개발 환경에서 컨테이너를 호스트하고 추가 개발자 도구를 제공하기 위해 Docker는 Windows 또는 macOS용 Docker CE(Community Edition)를 제공합니다. 이러한 제품은 컨테이너를 호스트하는 데 필요한 VM(Docker 호스트)을 설치합니다. Docker는 기업 개발용으로 설계되고 프로덕션 환경에서 대규모의 업무상 중요한 애플리케이션을 빌드, 제공 및 실행하는 IT 팀에서 사용되는 Docker EE(Enterprise Edition)도 제공합니다.

Windows 컨테이너를 실행하기 위해 다음 두 가지 유형의 런타임이 있습니다.

  • Windows Server 컨테이너는 프로세스 및 네임스페이스 격리 기술을 통해 애플리케이션 격리를 제공합니다. Windows Server 컨테이너는 컨테이너 호스트와 호스트에서 실행 중인 모든 컨테이너와 커널을 공유합니다.

  • Hyper-V 컨테이너는 고도로 최적화된 가상 머신에서 각 컨테이너를 실행하여 Windows Server 컨테이너가 제공하는 격리를 확장합니다. 이 구성에서 컨테이너 호스트의 커널은 Hyper-V 컨테이너와 공유되지 않으므로 격리 기능이 향상됩니다.

이러한 컨테이너의 이미지가 생성되고 동일한 방식으로만 작동합니다. 차이점은 이미지에서 컨테이너가 생성되는 방식에 있으며, Hyper-V 컨테이너를 실행하려면 추가 매개 변수가 필요합니다. 

 

Docker 컨테이너와 가상 머신 비교

위 다이어그램에 나와 있듯이 VM에는 호스트 서버에 3개의 기본 레이어가 있습니다. 아래부터 위로 순서대로 인프라, 호스트 운영 체제 및 하이퍼바이저입니다. 그 위로 각 VM에 고유 OS와 모든 필요한 라이브러리가 있습니다. 반면, Docker의 경우 호스트 서버에는 인프라와 OS만 있습니다. 그 위에서 컨테이너 엔진은 컨테이너를 격리된 상태로 유지하지만 단일 기본 OS 서비스를 공유할 수 있게 합니다.

컨테이너는 훨씬 적은 리소스를 필요로 하므로(예: 전체 OS가 필요하지 않음) 보다 쉽고 빠르게 배포할 수 있습니다. 따라서 밀도가 높아지고, 이는 동일한 하드웨어 장치에서 더 많은 서비스를 실행할 수 있어 비용을 절감할 수 있음을 의미합니다.

동일한 커널에서 실행되는 부작용으로 VM보다 격리성은 떨어집니다.

이미지의 주요 목표는 서로 다른 배포에서 동일한 환경(종속성)을 보장하는 것입니다. 즉, 머신에서 이를 디버깅한 다음, 동일한 환경의 다른 머신에 배포할 수 있습니다.

컨테이너 이미지는 앱 또는 서비스를 패키지로 만들고 이를 안정적이고 재현 가능한 방식으로 배포하는 방법입니다. Docker는 기술일 뿐만 아니라 철학이면서 프로세스이기도 합니다.

Docker를 사용할 때 개발자는 “내 머신에서 작동하는데 왜 프로덕션 환경에서는 안 되지?”라고 말하지 않습니다. 패키지된 Docker 애플리케이션은 지원되는 모든 Docker 환경에서 실행될 수 있기 때문에 "Docker에서 실행"되고 모든 배포 대상(예: 개발, QA, 스테이징 및 프로덕션)에서 의도된 방식으로 실행된다고 말할 수 있습니다.

 

4. APollo

GraphQL의 클라이언트 라이브러리 중 하나로 GraphQL을 사용한다면 거의 필수적으로 사용하는 상태 관리 플랫폼입니다. 다른 선택지로 GraphQL을 개발한 Facebook에서 직접 만든 Relay가 있지만, 학습 비용이 높고 React 계열만 지원한다는 단점이 있으며, 그에 반해 Apollo는 유연하고 러닝 커브가 높지 않을뿐더러 Front-End 프레임워크 삼대장인 React, Agular, Vue를 동시 지원한다는 점에서 인기가 높은 것 같습니다.

 

 

Apollo 자체는 플랫폼에 종속적이지 않으므로 앞으로 GraphQL과 함께 웹 및 모바일 시장을 장악하겠다는 당찬 야망을 가지고 있습니다.

 

 

특징

1. Query 및 Muation 직접전송

단순해 보이지만, 이는 클라이언트를 이용하는 주요 이유 중 하나이자, 엄청난 파급효과를 일으킵니다.

Query 및 Mutation을 Apollo에서 전송함으로써 얻는 이점은 바로, API 서버에서 데이터를 가져오기 위해 번거로운 네트워크단의 HTTP 요청을 신경 쓸 필요가 없어진다는 것입니다.

 

2. 전송받는 데이터 캐싱

Apollo는 Query를 통해 전송받은 데이터를 자동으로 캐싱 합니다.

그에 따라, 클라이언트의 반복 요청을 줄여 서버 부하를 줄일 수 있을 뿐만 아니라, 서비스를 이용하는 사람들에게 더 나은 사용자 경험을 제공할 수 있습니다.

또한, 크롬 브라우저에서 Apollo Client Developer Tools 익스텐션을 설치하면, 개발 환경에서 캐시 상태와 정보를 즉시 확인이 가능하므로 무척 편리합니다.

 

3. Local state 관리

Apollo를 사용하면, GraphQL 서버에 Query, Mutation, Resolver를 작성하듯이, 동일하게 클라이언트에서도 클라이언트 만의 Local state를 만들어 Query, Mutation, Resolver의 사용이 가능합니다.

이는 서버에서 받아온 데이터와 클라이언트에서 관리하는 데이터를 병합할 수 있음을 의미하며, 이를 이용해 효율적인 프로그래밍과 데이터 관리가 가능해집니다.

단, GraphQL 서버에 지정되어 있는 type 중에서 필드를 생성해야만 하며, 클라이언트에서 생성한 Local state는 서버에 전송되지 않아야 하므로 @client 키워드를 사용해 제어해야 합니다

 

 

5. Neo4j

 

Neo4j사가 개발한 그래프 데이터베이스 관리 시스템입니다. 개발자들은 Neo4j에 대해 네이티브 그래프 저장 및 처리 기능을 갖춘 ACID를 준수하는 트랜잭셔널 테이베이스로 기술하고 있습니다. 가장 대중적인 그래프 데이터 베이스입니다.

 

 

특징

 

이상탐지

그래프 데이터베이스는 정교한 이상 탐지와 예방 기능이 있습니다. 그래프 데이터베이스를 사용하면 관계를 사용하여 거의 실시간으로 금융이나 구매 트랜잭션을 처리할 수 있습니다. 빠른 그래프 쿼리를 사용하면 구매하려는 사람이 이미 알려진 이상 사례에 포함된 것과 같은 이메일 주소와 신용 카드를 사용하는지 여부를 감지할 수 있습니다. 또한, 그래프 데이터베이스는 하나의 개인 이메일 주소와 연결된 여러 사람들 또는 IP 주소는 같지만 실제로는 서로 다른 주소에 거주하는 사람들 간의 관계 패턴을 파악하는 데 도움이 될 수 있습니다.

 

추천엔진

그래픽 데이터베이스는 훌륭한 추천 애플리케이션입니다. 그래프 데이터베이스를 사용하면 고객 관심 분야, 친구, 구매 이력과 같은 정보 카테고리들 사이의 그래프 관계를 저장할 수 있습니다. 고도의 가용성을 가진 그래프 데이터베이스를 사용하여 같은 운동을 즐기고 비슷한 구매 이력을 가진 다른 사용자가 어떤 제품을 구입했는지에 따라 사용자에게 제품을 추천할 수 있습니다. 또는 공통의 친구가 있지만 서로는 아직 모르는 사람들을 찾아내어 친구를 추천할 수도 있습니다.