Rabbit MQ 스터디 210701-705
0701
RabbitMQ - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
RabbitMQ - 위키백과, 우리 모두의 백과사전
ko.wikipedia.org
RabbitMQ에 대해 (nesoy.github.io)
래빗엠큐 특징 -
AMQT 프로토콜을 구현 해놓은 프로그램
신뢰성 – 안정성과 성능을 충족할 수 있도록 다양한 기능 제공
유연한 라우팅 – Message Queue가 도착하기 전에 라우팅 되며 플러그인을 통해 더 복잡한 라우팅 가능
클러스터링 – 로컬네트워크에 있는 여러 RabbitMQ 서버를 논리적으로 클러스터링 할 수 있고 논리적인 브로커도 가능 하다.
관리 UI가 있어 편하게 관리 가능하다
거의 모든 언어와 운영체제 지원
오픈소스이며 상업적 지원
송신
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()
수신
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
print(' [*] Waiting for messages. To exit press CTRL+C')
def callback(ch, method, properties, body): print(" [x] Received %r" % body)
channel.basic_consume('hello', callback)
channel.start_consuming()
[RabbitMQ] 무작정 시작하기 (2) - Publish/Subscribe (tistory.com)
[RabbitMQ] 무작정 시작하기 (2) - Publish/Subscribe
이 포스트는 Windows 10, Python 3.7.4 를 기준으로 작성되었음. 2020/01/08 - [Back-end/RabbitMQ] - [RabbitMQ ] 무작정 시작하기 (1) - 설치 및 실행 지난 포스트에서는 RabieMQ Server를 설치하고 설정하고 실..
heodolf.tistory.com
클라이언트가 요청이 올 때만 응답을 하고 계속 대기상태에 있는 방식을 Pull 방식이라 한다.
반대로 서버에서 클라이언트로 정보를 보내주는 방식을 Push방식이라 한다.
예를 들면 스마트폰의 푸쉬 알람
Pull 방식을 쓰면 계속 수동으로 새로고침(새로운 요청)을 해야 새로운 데이터가 갱신되는 반면,
Push 방식을 쓰게 되면 자동으로 데이터가 갱신되게 할 수 있다.
이 때 Push 방식은 발행(publish) - 구독(subscribe) 방식으로 서버를 구축한다.
간단하게 말하면 구독을 신청한 수신자에게만 push를 보내는 것이다.
https://ko.wikipedia.org/wiki/%EB%B0%9C%ED%96%89-%EA%B5%AC%EB%8F%85_%EB%AA%A8%EB%8D%B8
발행-구독 모델 - 위키백과, 우리 모두의 백과사전
발행-구독 모델은 비동기 메시징 패러다임이다. 발행-구독 모델에서 발신자의 메시지는 특별한 수신자가 정해져 있지 않다. 대신 발행된 메시지는 정해진 범주에 따라, 각 범주에 대한 구독을
ko.wikipedia.org
서버프로그래밍 개념 - Push 방식 : 네이버 블로그 (naver.com)
서버프로그래밍 개념 - Push 방식
클라이언트가 요청이 올 때만 응답을 하고 계속 대기상태에 있는 방식을 Pull 방식이라 한다. 반대로 서버...
blog.naver.com
0702
메시징 플랫폼은 크게 두가지로 나뉜다.
1.메시지 브로커와
2.이벤트 브로커 (메시지 브로커의 역할을 할 수가 있음)
래빗엠큐는 메시지 브로커
메시지 브로커에 있는
큐에 데이터를 보내고 받는것이 프로듀서와 콘슈머
MQ(메시지큐)를 사용하는 이유 중 하나는
서버 다운타임 등 시스템 장애에 대한 대비한 요청 방법 으로 이용 가능한 것
메세지 처리 후 짧은 시간내에 삭제함
레코드 = 이벤트 또는 메시지라고 불림
이벤트 브로커는 레코드 장부를 하나 보관하고 인덱스르 통해 개별 관리
참고: https://youtu.be/H_DaPyUOeTo
공식 홈페이지
Messaging that just works — RabbitMQ
Developer Experience Deploy with BOSH, Chef, Docker and Puppet. Develop cross-language messaging with favorite programming languages such as: Java, .NET, PHP, Python, JavaScript, Ruby, Go, and many others.
www.rabbitmq.com
RabbitMQ에서 사용하는 용어
- Producer
: 메시지를 보내는 Application
- Publish
: Producer가 메시지를 보냄
- Queue
: 메시지를 저장하는 버퍼 : Queue는 Exchange에 Binding된다.
- Consumer
: 메시지 받는 User Application : 동일 업무를 처리하는 Consumer는 보통 하나의 Queue를 바라본다. (중복방지) : 동일 업무를 처리하는 Consumer가 여러개 인 경우 같은 Queue를 바라보게 하면 자동으로 메시지를 분배하여 전달함
- Subscribe
: Consumer가 메세지를 수신하기 위해 Queue를 실시간으로 리스닝하도록 만듬.
- Exchange
: Producer가 전달한 메시지를 Queue에 전달하는 역할
메시지가 Queue에 직접 전달되지 않고 exchange type이라는 속성에 정의된데로 동작
- Exchange type
: 특정 Queue에 보낼지, 여러 Queue에 보낼지, 아니면 그냥 제거될지 등을 선택
type | 설명 | 특징 |
fanout | 알려진 모든 Queue에 메시지 전달 함 | Broadcast |
direct | 지정된 routingKey를 가진 Queue에만 메시지 전달 함 | unicast |
topic | 지정된 패턴 바인딩 형태에 일치하는 Queue에만 메시지 전달. #(여러단어), *(한단어)를 통한 문자열 패턴 매칭 | multicast |
header | 헤더에 포함된 key=value의 일치조건에 따라서 메시지 전달 | multicast |
Bindings
: Exchange와 Queue를 연결해주는 것
- Routing
: Exchange가 Queue에 메시지를 전달하는 과정
- RoutingKey
: Exchange와 Queue가 Binding될 때 Exchange가 Queue에 메시지를 전달할지를 결정하는 기준
: Publish RoutingKey가 Binding시 설정된 RoutingKey값과 일치하거나 (exchange type=direct 경우) RoutingKey값이 Binding시 설정된 패턴에 매칭될 때 (exchange type=topic 경우)
RabbitMQ Flow
Exchange를 별도로 명시하지 않은 경우
- Producer가 메시지를 생성하여 전송
- Exchange가 어떤 Queue에 전달할지를 Routing
- Queue가 메시지를 순차적으로 쌓음
- Consumer가 Queue에 대한 Binding을 가지고 있다가 메시지를 Queue에서 수신
기억은 30초 기록은 30년 : 네이버 블로그
당신의 모든 기록을 담는 공간
blog.naver.com
워크 플로우를 설명하자면 아래와 같다.
- Producer는 Message를 Exchange에게 보내게 됩니다.
- Exchange를 생성할때 Exchange의 Type을 정해야 합니다.
- Exchange는 Routing Key를 사용하여 적절한 Queue로 Routing을 진행합니다.
- Routing은 Exchange Type에 따라 전략이 바뀌게 됩니다.
- Exchange - Queue와 Binding이 완료된 모습을 볼 수 있습니다.
- Message 속성에 따라 적절한 Queue로 Routing이 됩니다.
- Message는 Consumer가 소비할때까지 Queue에 대기하게 됩니다.
- Consumer는 Message를 소비하게 됩니다
출처: https://coding-start.tistory.com/371 [코딩스타트]
AMQP 구성요소
익스체인지 타입으로
라우팅 의 형식 이 정해지기 때문에
어떤 타입으로 사용할 지가 중요하게 느껴진다
참조해볼것
AMQP 0-9-1 모델 설명 | 폭간의 기술블로그 (sejoung.github.io)
AMQP 0-9-1 모델 설명 | 폭간의 기술블로그
AMQP 0-9-1 모델 설명 AMQP 0-9-1은 무엇입니까? AMQP 0-9-1 (고급 메시지 큐 프로토콜)은 적합한 클라이언트 응용 프로그램이 적합한 메시징 미들웨어 브로커와 통신 할 수 있도록하는 메시징 프로토콜
sejoung.github.io
Rabbit MQ 정리? : 네이버 블로그 (naver.com)
Rabbit MQ 기초 사용법 - Yun Blog | 기술 블로그 (cheese10yun.github.io)
Rabbit MQ 기초 사용법 - Yun Blog | 기술 블로그
Rabbit MQ 기초 사용법 - Yun Blog | 기술 블로그
cheese10yun.github.io
설치
[RabbitMQ] 무작정 시작하기 (1) - 설치 및 실행 (tistory.com)
[RabbitMQ] 무작정 시작하기 (1) - 설치 및 실행
이 포스트는 Windows10 기반으로 작성되었음. 메시지 브로커의 하나이며 메시지 브로커에 대한 설명은 [Message Broker란?] 포스트를 참조하길 바란다. RabbitMQ는 여러 측면에서 사용되지만 필자는 Python
heodolf.tistory.com
Erlang Programming Language
OTP 24.0 has been released OTP 24.0 Readme File OTP 24.0 Source File (248) OTP 24.0 Windows 32-bit Binary File (248) OTP 24.0 Windows 64-bit Binary File (248) OTP 24.0 HTML Documentation File (248) OTP 24.0 Man Pages File (248) OTP 24 Erlang/OTP 24 is a ne
www.erlang.org
우선 래빗엠큐 언어인 얼랭을 설치함
래빗엠큐 설치
Downloading and Installing RabbitMQ — RabbitMQ
환경변수 설정
얼랭 홈도 시스템 환경변수 추가
명령창
입력 :
rabbitmq-server
첫시도 결과 에러..
포트가 사용중이라 에러
1. 사용중인 포트 확인
- 명령어 : netstat -ano
2. PID값으로 사용중인 포트 중지
taskkill /f /pid 1111
다른 방법
can't start rabbitmq-server after installation on windows - Stack Overflow
can't start rabbitmq-server after installation on windows
I try to run this 'rabbitmq-server' command in my cmd but that give me this error ... Configuring logger redirection 13:44:01.865 [warning] Using RABBITMQ_ADVANCED_CONFIG_FILE: c:/Users/saikat/AppD...
stackoverflow.com
같은 질문에 달린 댓글중 이방법을 시도
If you are on windows then go to Services
- Search RabbitMq and Right click
- Stop service
- Open cmd as administrator
- run cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.17\sbin
- and then run rabbitmq-server
- 답변자 : Ömer
아까는 cmd 창을 관리자 권한으로 안열어서 엑세스가 거부되었던거 같다
결과는 성공
유아이를 위한 플러그인 설치
cmd창 명령:
rabbitmq-plugins enable rabbitmq_management
래빗엠큐 서버 스타트 후에
웹에서 localhost:15672 주소로 접속
username: guest
password: guest
게스트 계정으로 접속
코딩스타트 :: RabbitMQ - 레빗엠큐 개념 및 동작방식, 실습 (tistory.com)
RabbitMQ - 레빗엠큐 개념 및 동작방식, 실습
yoonyeoseong/rabbitmq-sample Contribute to yoonyeoseong/rabbitmq-sample development by creating an account on GitHub. github.com 오늘 포스팅할 내용은 래빗엠큐이다. 그 동안에는 카프카를 사용할 일이..
coding-start.tistory.com
이클립스 상 활용
Eclipse 를 이용한 Rabbit MQ T.. : 네이버블로그 (naver.com)
Eclipse 를 이용한 Rabbit MQ Tutorial ( 1 )
1. Install Erlang 1 ) 설치 이유 : Rabbit MQ 설치 전에 먼저 설치되어 있어야 함 ( Rabbit MQ 먼...
blog.naver.com
라이브러리 다운
amqp client 다운로드
Maven Repository: com.rabbitmq » amqp-client (mvnrepository.com)
버전 선택 후 나오는 창에서 jar 다운로드
이클립스 다이나믹 웹프로젝트에 라이브러리 붙여넣기
블록그 글 과 같은 현상발생하여 추가 라이브러리 적용
Maven Repository: org.slf4j » slf4j-api (mvnrepository.com)
send 코드
package 패키지명;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class rabbit_mq {
private final static String QUEUE_NAME = "thisisQueueName"; // 이것은 Queue name
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null); //큐선언
String message = "조금 더 이해가 되도록 합시다";
//퍼블리쉬
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
//채널.베이직 퍼블리쉬(익스체인지 타입,큐이름,프로퍼티 설정,스트링을 바이트로 바꾸어)
System.out.println(" Sent : '" + message + "'"); //콘솔창에 출력된다
channel.close();
connection.close();
}
}
결과
아직 내부적인 흐름이 잘 안보이지만
큐에 메시지 저장 성공했다
receive 코드
package tori_rabbitMQ;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
//리시브 코드이며 전송완료된 메시지는 이제 큐에서 삭제됩니다
public class rabbit_mq_r {
private final static String QUEUE_NAME = "hello"; //큐네임 ( 메시지를 가져올 큐)
public static void main(String[] argv) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); //
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//윗부분은 메시지를 센드할 떄와 같음
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
//컨슈머
Consumer consumer = new DefaultConsumer(channel) { //생성과 동시에 메소드 재정의
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException { // 메소드 재정의 , 인자로 들어오는 body 는 바이트화된 메시지
String message = new String(body, "UTF-8"); //바이트 배열 메시지를 스트링으로 변환
System.out.println(" Receive : '" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
큐 메시지 전송
큐에서 메시지 는 비워지지만
큐네임은 그대로 남아있다
실행시
큐에 퍼블리쉬했던 모든 메시지가 한번에 출력이 된다
7.05
MQ 사용이유
[RabbitMQ] rabbitMQ는 왜쓸까? : 네이버 블로그 (naver.com)
[RabbitMQ] rabbitMQ는 왜쓸까?
기존 문제점 - 애플리케이션과 강하게 결합되어, db서버가 응답할 때까지 기다려야한다. - db 장애시 애플...
blog.naver.com
네이버클라우드 플랫폼에
래빗엠큐도 있었다