# AMQP
Spring Boot FCM 전송 API 처리 속도 향상(Feat. Kafka)
안녕하세요 이번 시간에는 Kafka를 활용하여 FCM 전송 API의 처리 속도를 향상시키는 방법에 대해 알아보겠습니다. Kafka는 메시지 큐의 일종입니다. 메시지 큐란 컴퓨터 시스템 또는 어플리케이션 간에 비동기적으로 데이터나 작업을 교환하기 위한 통신 패턴입니다. 발신자와 수신자가 독립적으로 작동하며 데이터를 직접 주고받지 않고 중간 매개체를 통해 데이터를 전달할 수 있습니다. 메시지 큐는 크게 프로듀서, 컨슈머, 브로커로 이루어져 있습니다. 프로듀서란 메시지를 생성하고 메시지 큐로 보내는 역할을 담당하며 컨슈머는 메시지 큐에서 메시지를 가져와 처리하는 역할을 담당합니다. 브로커는 메시지 큐 시스템을 관리하고 중재하는 중간 매개체로 프로듀서가 메시지를 브로커로 보내고 컨슈머가 브로커에서 메시지를 가져오게 됩니다. 이 때 Pub/Sub 방식으로 **프로듀서가 브로커에 메시지를 전송하면 관련된 메시지를 구독하고 있는 컨슈머가 브로커에서 해당 메

표준 메세징 프로토콜 정리 (AMQP, STOMP, MQTT)
AMQP (Advanced Message Queue Protocol) 등장 배경 AMQP는 메세지 지향 미들웨어 (MOM) 을 위한 표준 응용 계층 프로토콜입니다. 간단히 말하면, 메세지 통신을 위한 규약 스펙 입니다. 플랫폼 종속적인 제품들 사이에서 서로 다른 이기종간에 메세지를 교환하기 위해서는 메세지 포맷 변환을 위해 속도가 느린 메세지 Bridge를 이용하거나, 시스템 자체를 통일 시켜야 하는 불편함과 비효율성이 있었습니다. 그래서, 서로 다른 시스템들 간의 최대한 효율적인 방법으로 메세지를 교환하기 위해 AMQP 프로토콜이 등장하게 되었습니다. AMQP는 금융계의 이기종 플랫폼간의 메세지 상호 정보 교환을 위해서 JPMorgand의 John O'Hara에 의해

Spring AMQP
Spring AMQP Spring AMQP : Spring에서 AMQP기반 메시징 애플리케이션을 개발할 수 있도록 Spring의 개념을 적용한 라이브러리 AMQP(Advanced Message Queuing Protocol) : MQ(Message Queuing)기반의 프로토콜 동작 원리 Exchange가 Producer로부터 메시지를 받고 Queue에 전달한다. Queue는 Consumer에게 메시지를 전달한다. Producer(Publisher) : 메시지를 보내는 곳 Consumer(Subscriber) : 메시지를 받는 곳 Exchange : Producer로부터 메시지를 수신하는 곳. 수신한 메시지를 큐에 분배한다. Queue : 메시지를 저장하는 곳. 저

[WebSocket] RabbitMQ, AMQP
들어가며 최근에 웹 소켓을 이용하여 실시간 통신 및 비동기 통신을 공부하면서 메시지 브로커 소프트웨어인 RabbitMQ를 사용하게 되었다. RabbitMQ에 대하여 자세히 알아보면서 해당 글을 작성하게 되었다. 해당 글을 읽게 되는 사람들도 나와 비슷한 이유이지 않을까 싶다. RabbitMQ는 뭔데요? RabbitMQ는 쉽게 말하면 오픈 소스 메시지 브로커 미들웨어이다. 응용 소프트웨어 (서버 - 클라이언트) 간의 데이터 통신을 위한 소프트웨어라고 생각하면 쉽다. 구체적으로 들어가면 AMQP를 구현한 구현체이고, STOMP, MQPP와 같은 프로토콜을 지원하기 위해 확장되고 있다. AMQP는 또 뭔데요..? AMQP는 Advanced Message Queuing Protocol, 즉 메세지 큐를 이용하여 인스턴스끼리 데이터를 교환하는 프로토콜을 의미한다. 
Chapter1. Kafka 서론
카프카의 탄생 파편화된 데이터 수집 및 분배 아키텍처를 운영하는데 어려움이 있었다. 데이터를 생성하고 적재하기 위해서는 아래 2가지 Application이 연결되어야 한다. 데이터를 생성하는 Source Application 데이터가 최종 적재되는 Target Application 초기에는 단방향 통신을 통해 직접 연결 Source Application, Target Application 개수가 점점 많아지면서 문제 발생 파이프라인 개수가 많아지면서 버전 관리에 이슈 발생 장애 발생시, 그대로 다른 Application에 전파됨 카프카 도입 이전 데이터 파이프라인 아키텍처 
rabbitmq queue type: classic, quorum, stream -> amqplib 적용 [에러내용]: in vhost '/': received none but current is the value 'quorum' of type 'longstr'"
rabbitmq 3.8 버전 - quorum rabbitmq 3.9 버전 - stream queue type 이 추가되었다. 기존에 사용하던 queuesms classic type 이다 즉, 쿼럼 큐는 더 안전한 방식, 스트림 큐는 카프카와 비슷한 방식이라고 할 수 있겠다. 스트림 큐에 대한 다른 설명: https://news.hada.io/topic?id=4613 큐 타입을 지정하는 것은 exchange와는 별개이기때문에, app을 사용할 때 publisher에는 아무 처리 안하고 consumer에만 큐 타입을 지정하면 된다. 그런데 amqplib 공식문서는 물론이고 검색을 해도 큐 타입을 어떻게 지정하는지 안나온다. 중요한 arguments 타입이 any로 나와있어 알 수가 없다. 그래서 이런 에러가
AMQP 입문 - celery 공식문서 번역
celery의 AMQP Primer 를 번역했습니다. Messages message는 header와 body로 구성돼있다. Celery는 header를 message의 content type과 내용의 encoding을 저장하는데 쓴다. content type은 보통 message를 직렬화(serialize)하는데 쓰이는 직렬화 포맷(serialization format)이다. body는 실행될 task의 이름과 task의 id(uuid), task에 적용될 아규먼트들, 그리고 재시도 횟수나 ETA(??)같은 몇개의 추가적인 메타 데이터들을 갖고 있다. 아래는 Python dictionary 타입으로 된 task message 예제이다. Producers, consumers and brockers message 발신자를 일반적으로 publishe
amqplib 셋팅
https://tlqckd0.tistory.com/17 https://tlqckd0.tistory.com/18 https://tlqckd0.tistory.com/19 공식문서 https://amqp-node.github.io/amqplib/channel_api.html
RabbitMQ 동작 이해하기
https://jonnung.dev/rabbitmq/2019/02/06/about-amqp-implementtation-of-rabbitmq/#gsc.tab=0

[RabbitMQ] RabbitMQ의 동작과 Exchange Type
AMQP의 기본 개념 AMQP는 애플리케이션간에 데이터를 주고받을 때, 메시지 미들웨어 브로커를 통해 데이터를 주고받을 수 있게 해주는 메시징 프로토콜이다. 여기서 데이터를 주고받기 위해 거치게 되는 메시지 미들웨어 브로커의 종류 중 하나가 RabbitMQ이다. 브로커는 producer(혹은 publisher)로부터 전달 받은 메세지를 알맞는 consumer에게 전달해준다. AMQP 또한 네트워크 프로토콜이기 때문에 producer, consumer 그리고 broker는 모두 다른 컴퓨터 시스템에서 동작할 수 있다. Message Queue란? 메세지 큐는 프로세스 혹은 프로그램 간의 데이터를 교환할 때 사용하는 통신 방법 중 하나로, 메세지 지향 미들웨어를 구현한 시스템을 의미한다. 쉽게

RabbitMQ
메세지큐 메세지 큐는 응용 소프트웨어 간의 비동기 통신을 위한 메시지 지향 미들웨어를 구현한 시스템으로 producer로부터 들어오는 메세지(요청)를 큐에 담고 consumer는 큐에 담긴 메세지를 꺼내 처리하는 방식의 구조로 구현되어 있다. 기존 동기적인 방식의 메세지 교환을 미들웨어의 비용을 추가하여 비동기식으로 처리하게 될 때 얻게 되는 장점은 다음과 같다. 모든 요청은 메세지큐에 저장되고 처리가 가능한 요청만을 메시지큐에서 꺼내와 처리하고 있어 서버의 부담을 줄일 수 있다. 일부가 실패해도 전체에 영향을 주지 않는 탄력성을 제공하고 실패할 경우 재실행이 가능하다. 메세지를 전달하는 과정에서 보관을 하고 있어 통신을 하는 클라이언트 간 네트워크 연결이 유지되어야 하는 TCP와 다르게 연결을 유지할 필요가 없어지는 만큼 어플리
AMQP와 카프카
AMQP 란? Advanced Message Queing Protocol의 약자로, 흔히 알고 있는 MQ의 오픈소스에 기반한 표준 프로토콜을 의미하며 이 프로토콜을 기반으로 하여 구현된 메시지 브로커로는 Apach Qpid, Apach ActiveMQ, RabbitMQ가 있다. 이 브로커들은 모두 AMQP를 구현하기 때문에, 사용법이 거의 비슷하다. AMQP 특징 위의 표를 보면 총 4개의 구역으로 나뉘는데 publish, exchange, queue, consumer 로 표현할수 있다. 직접교환 키를 사용한 라우팅 방식 팬아웃 교환 모든 메시지를 모든 큐로 라우팅하는 유형이다. 토픽 교환 와일드카드를 이용해서 메시지를 큐에 매칭시키는 방법이다
RabbitMQ
RabbitMQ Producer가 Message를 Queue에 넣어두면, Consumer가 Message를 가져와 처리하는 방식 Client와 동기방식으로 많은 데이터를 통신하면 병목현상이 생겨 서버의 성능이 저하된다. 이런 현상을 막고자하여 또 하나의 미들웨어에 메세지를 위임하여 순차적으로 처리하는 방식을 말한다. Producing : 메세지를 전송한다는 의미 Producer : 메세지들을 전송하는 프로그램을 Producer라 부른다. Queue : MailBox를 의미하며 RabbitMQ 시스템 내에 위치한다. consumer 대신에 RabbitMQ가 보관하고 메시지 버퍼 외부연동 서버에서 이 비동기 처리를 쉽게 구현하기 위해 MQ(Message Queuing)을 사용한다. AMQP 인스턴스가 데이터를 서로 교환할 때 사용하는 방법 MQ를 오픈 소스에 기반한 표준 프로토콜이 AMQP(Advanced Message Queuing Protocol)이다. AMQP 자체가 프로

[Docker] Springboot RabbitMQ 초간단 연동
개발환경 OS: Windows 11 IDE: Spring Tool Suite 4.14.1 JAVA: 17 \* [Docker] Docker Compose로 RabbitMQ, Redis 함께 구동하기에서 이어지는 글입니다. Springboot RabbitMQ 연동 * RabbitMQ를 도커로 실행중이라는 전제 하에 진행 (참고: https://velog.io/@armton/series/Docker) 1. Springboot 프로젝트 생성 1-1. New Project > Spring Starter Project 
AMQP >AMQP Advanced Message Queing Protocol의 약자로, 흔히 알고 있는 MQ의 오픈소스에 기반한 표준 프로토콜을 의미한다. 대부분 AMQP를 기반으로 제작된 메시지 큐 이다. 그렇다면, AMQP는 어떤 방식으로 동작을 할지 알아야 해당 프로그램들이 어떻게 작동하는지 알기 쉬울것이다. AMQP는 메시징 프로토콜의 한 종류로, 인스턴스끼리 서로 데이터를 교환할 때 사용하는 방법이다. 구성요소 및 라우팅 알고리즘 Exchange → Publisher(Producer)로부터 수신한 메시지를 큐에 분배하는 라우터 역할 Queue → 메시지를 메모리나 디스크에 저장했다가 Consumer에게 메시지를 전달하는 역할 Binding → Exchange와 Queue의 관계를 정의한다. 여기에서 Exchange는 수신한 메시지를 큐에 분배하는 라우터 역할을 한다고 했다. 하지만, 이 Exchange들은 어떻게 큐에 분배를 하게 될까? 사실 이

메시지 큐와 프로토콜
💡 메시지 큐(MQ)에 대해 학습하고 정리한 글입니다. Queue는 이전부터 익히 들었던 데이터 구조입니다. 큐는 2개의 끝을 가지고 있으며 각각은 머리와 꼬리의 역할을 합니다. 새로운 아이템은 꼬리로 입력되며 제거할 아이템은 머리에서 저게됩니다. 이런 구조를 FIFO(First In First Out)라고 모두 알고 계실 것입니다. 메시지 큐도 마찬가지로 Queue입니다. 큐가 메시지들로 채워져있으며 큐의 기본적인 원리를 그대로 따릅니다. 대신 머리와 꼬리와 연결된 Producer와 Consumer가 등장합니다. Proucer는 메시지 큐에 새로운 메시지를 추가하고 Consumer는 메시지 큐에서 메시지를 제거함으로 두 종단간에 데이터를 교환합니다. 비즈니스 적인 관점에서 보면 이 데이터 교환은 커머스에서 주문 유저의 회원가입 사용자의 서비스 요청이 될 수 있습니다. Producer는 Consumer에게
MQ, AMQP
웹 채팅 토이 프로젝트 진행 중에 대화 내용을 저장하기 위한 방법을 찾던 중, MQ를 알게 되었고 MQ, AMQP에 대해 알게된 내용을 정리합니다. 자세한 내용은 출처 자료 확인을 추천합니다. MQ(Message Queue)란? MQ란 프로세스(프로그램) 간에 데이터를 교환할 때 사용하는 통신방법 중 하나이다. 사용자가 접속해서 트래픽을 발생시키는 API와 데이터를 계속해서 처리하고 있는 분석 서버가 한 컴퓨터에서 같이 돌아가게 되면, 갑자기 트래픽이 폭주하는 상황에서 분석 서버가 죽거나 또는 분석할 데이터양이 늘어 분석 서버가 폭주해서 API 서버가 죽어버려 서비스를 하지 못하게 되는 문제가 발생할 수 있다. 그래서 백엔드의 front라 할 수 있는 API 서버와 백엔드의 back이라고 할 수 있는 Analysis 서버를 한 컴퓨터에서 모두 돌리는 것은 위험하다. -> 서버를 분할하자. 그럼 분할된 서버들이 어떻게 데이터를 주고받느냐가 문제인데, 분석 서버
Spring AMQP(1)
Spring AMQP Doc 번역하기 첫 번째 시작하기에 앞서, 아래의 내용을 build.gradle에 적어준다. Quick Start Java Configuration AMQP 추상화 스프링 AMQP는 'spring-amqp'와 'spring-rabbit' 두 가지의 모듈로 이루어진다. spring-amqp 모듈은 'org.springframework.amqp.core' 패키지를 포함한다. 이것의 의도는 개발자가 특정한 라이브러리나 broker구현에 의존하지 않게 하기 위함이다. 개발자는 추상화 계층에 대해서만 개발할 수 있기 때문에, 코드의 이식성이 높아질 수 있다. 코드는 broker 모듈에 의해 구현된다. 현재 RabbitMQ만 존재한다. AMQP는 프로토콜 레벨에서 작동하므로 원칙적으로는 AMQP를 지원하는 어떤 broker에서도 작동할 수 있다. <

AMQP
AMQP란? >메세지 지향 미들 웨어를 위한 표준 응용 계층 프로토콜 등장 배경 플랫폼 종속적인 제품들 사이에서 서로 다른 이기종간에 메세지를 교환하기 위해서는 메세지 포멧 컨버전을 위한 메시지 브릿지(속도 느림)를 이용하거나 시스템 자체를 통일 시켜야 하는 불편함과 비효율성이 있었다. -> 서로 다른 시스템들 간의 최대한 효율적인 방법을 교환하기 위한 AMMQ 프로토콜의 등장 AMQP 특징 모든 broker들은 똑같은 방식으로 동작할것 모든 client들은 같은 방식으로 동작할것 네트워크상으로 전송되는 명령어들의 표준화 프로그래밍 언어 중립적 AMQP Routing model component 구성 Exchange Queue Binding ![](https://images.velog.io/images/gjrjr4545/post/65d9f647-a9b5-4d51-9906-a15
[Rabbitmq] 'unable to perform an operation on node ~'
Rabbitmq Issue python에서 celery용 백엔드 및 작업 큐잉을 위해 Rabbitmq를 활용하기로 했다. 에러 내용 Rabbitmq 설치 후 rabbitmqctl status 명령어를 실행하면 아래와 같은 에러가 발생함 ` rabbitmqctl 및 rabbitmq-server 둘 다 위와 같은 에러를 뱉어내고 있다. 킹받네.. 해결 대부분의 문제는 재설치를 통해 해결 할 수 있다지만 이건 그렇지 않았다.... 문제는 Terminal에 로그인 되어있는 host 이름과 rabbitmq user의 명칭이 같아서 충돌이 난 것이었다. terminal에서 현재 로그인 되어있는 유저명이 jeff@ej31이라고 가정해보자 이 때 rabbitmqctl add_user ej31 password를 통해 유저를 생성하면 rabbitmq에서는 어리둥절해 진다. rabbitmq@ej31노드가 jeff@ej31