메시지 브로커 서비스
Amazone MQ는 완전 관리형 오픈 소스 메시지 브로커 서비스 입니다.
메시지 브로커를 사용하면 서로 다른 소프트웨어 시스템이, 대개 서로 다른 플랫폼에서 서로 다른 프로그래밍 언어를 사용하여, 통신하고 정보를 교환할 수 있습니다.
- Publisher(송신자)로부터 전달받은 메시지를 Subscriber(수신자)로 전달해주는 중간 역할
- 응용 소프트웨어 간에 메시지를 교환할 수 있게 합니다.
- 이 때 메시지가 적재되는 공간을 Message Queue(메세지 큐)라고 하며
- 메시지의 그룹을 Topic(토픽)이라고 합니다.
이처럼 메시지 브로커는 송신자가 보낸 메시지를 메시지 큐에 적재하고
이를 수신자가 받아서 사용하는 구조이다.
이러한 구조를 Pulibsh/Subscribe(pub/sub) Pattern이라고 하며,
Producer/Consumer Pattern 이라고도 합니다.
Publish-subscribe pattern == 주면 받아가라는 뜻
- 메세지 브로커를 예로 들어보면 재난 문자라고 할 수 있습니다.
전 국민의 휴대폰을 재난 토픽에 등록시켜 놓고 각 지역 단위로 토픽을 구성하여
재난 상황에 재난 토픽으로 전체 발생을 하고, 지역별 이슈는 지역 별로 발송을 하게 합니다.
메세지 브로커 단점
- DB를 사용하는 경우 Query를 이용하여 원하는 데이터만 필터링 하여 조회할 수 있지만, 메시지 브로커를 이용하면 Queue에 적재된 그대로 사용하기 때문에 불가능하다. 따라서, 적재할 때 필터링 된 데이터를 적재하던가 적재된 데이터를 Logstash를 이용하여 필터링 해서 사용해야 합니다.
- 메시지 큐에 적재된 메시지는 주로 7일을 보관하기 때문에 장기간 보관해야 하는 경우 별도의 저장소에 저장해야 합니다.
Kafka vs RabbitMQ vs ActiveMQ
- 3가지 전부 비동기 통신을 제공하고, 보낸 사람과 받는 사람을 분리합니다.
- 하지만 업무에 따라서 다른 목적을 가지고 있습니다. Kafka(Apache)는 처리량이 많은 분산 메시징 시스템에서 사용하며
- RabbitMQ, ActiveMQ(Apache)는 신뢰할 수 있는 메시지 브로커 역할을 하는 시스템에서 사용됩니다. (물론 Kafka도 신뢰할 수 있음. 상대적으로 두개가 아직은 더 신뢰성이 높다는 뜻)
- MQ는 broker가 producer 에게 메세지를 받아서 consumer에게 push해 주는 방식인데 반해, Kafka는 consumer가 broker로부터 직접 메시지를 가지고 가는 pull 방식으로 동작하기 때문에 consumer는 자신의 처리능력만큼의 메시지만 broker로부터 가져오기 때문에 최적의 성능을 낼 수 있다.
RabbitMQ = 빠르고 쉽게 구성 할 수 있으며 직관적.
- RabbitMQ는 고성능을 목표로 AMQP 프로토콜을 사용하여 개발된 MQ 로 Erlang OTP 기반으로 개발되었다.
- 신뢰성, 유연한 라우팅, 관리 UI의 편리성을 갖고 있습니다.
- 실시간 모니터링이 용이하고 다양한 언어 및 OS 지원, RabbitMQ 서버간 클러스터링이 가능하다.
- 클러스터의 여러 노드에 걸쳐 대기열을 복제하여 고가용성을 보장하여 하드웨어 오류가 발생한 경우에도 메시지가 손실되지 않도록 합니다.
Kafka = 확장성, 고성능 및 높은 처리량.
- 많은 데이터 전송과 최대 처리량을 유지하기에 대량 데이터 스트리밍에 적합하다.
- 상태 변경이 시간순으로 기록되어하는 응용 프로그램인 이벤트 소싱(Evenet Sourcing) 저장소로 적합하다.
- 대용량 실시간 로그 처리에 특화, 단순한 메시지 헤더를 지닌 TCP 기반의 프로토콜 사용으로 오버헤드 감소
- 분산 시스템으로 인해 분산 및 복제 구성 장점
- 그리하여 노드 장애에 대한 대응성을 가지고 있음
- 프로듀서는 각 메시지를 배치로 broker에게 전달하여 TCP/IP 라운드 트립을 줄임
- 기본적으로는 파일시스템에 저장을 통해 영속성(혹은 수명)을 보장 = 오류시 오류 지점부터 복구가 가능
- Kafka, Kinesis(aws)는 window 단위의 데이터를 넣고 꺼낼 수 있다
- 실시간 로그 처리에 특화되어 설계된 시스템으로 개발되어 타 MQ 대비 TPS가 매우 우수하나 특화된 솔루션이기 때문에 타 MQ 솔루션에서제공하는 다양한 기능들은 제공되지 않는다.
- AMQP, JMS 이 아닌 단순 메시지 헤더를 이용한 TCP 통신이다.
ActiveMQ = 효율적이고 사용하기 쉬운 오픈 소스.
- 자바로 만든 오픈소스 메시지 브로커
- 다양한 언어와 프로토콜을 지원(Java, C, C++, C#, Ruby, Perl, Python, 그리고 PHP 클라이언트)
- 다중 연결 프로토콜이 지원됩니다.
- Kafka에서는 사용할 수 없는 지연된 배달을 예약합니다.
- Kafka와 달리 ActiveMQ는 소량의 데이터가 관련된 경우에 사용하는 것이 좋습니다.
- '라운드 로빈' 방식을 사용하여 특정 소비자에게 메시지를 보냅니다.
AWS에서 테스트 해보기
Amazon MQ 는 ActiveMQ 또는 RabbitMQ 두 가지 타입으로 제공되는데
ActiveMQ에 대해 테스트를 해보겠습니다.
- Broker engineInfo: ActiveMQ
- Broker engine version: 5.16.3
- wire-level protocols: OpenWire
예제 프로그램(Java)
ActiveMQ를 통한 JMS(Java Message Service) 사용 예제를 활용하여 테스트를 진행 합니다.
https://docs.aws.amazon.com/ko_kr/amazon-mq/latest/developer-guide/amazon-mq-working-java-example.html
예제 프로그램은 JAVA 언어로 설명하고 있습니다.
https://start.spring.io/에 접속하여 테스트에 사용할 프로젝트 파일을 만들어 다운로드 합니다.
프로젝트 설정을 마치면 파일을 다운로드를 받게 됩니다.
프로젝트 이름을 Activemq11 이라면 프로그램의 실행 위치는 Activemq11Application.java 파일이 됩니다.
@SpringBootApplication
public class Activemq11Application {
// AWS ActiveMQ의 정보로 수정 합니다.
private final static String WIRE_LEVEL_ENDPOINT
= "ssl://b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9-1.mq.us-east-2.amazonaws.com:61617";
private final static String ACTIVE_MQ_USERNAME = "MyUsername123";
private final static String ACTIVE_MQ_PASSWORD = "MyPassword456";
// 여기에 AWS 문서 예제를 입력합니다.
public static void main(String[] args) throws JMSException {
final ActiveMQConnectionFactory connectionFactory =
createActiveMQConnectionFactory();
final PooledConnectionFactory pooledConnectionFactory =
createPooledConnectionFactory(connectionFactory);
sendMessage(pooledConnectionFactory); // 송신
receiveMessage(connectionFactory); // 수신
pooledConnectionFactory.stop();
}
}
송신 프로그램
receiveMessage() 메소드를 주석 처리 후 jar 형태의 파일로 export 합니다.
그리고 EC2 인스턴스에 업로드를 합니다.
java -jar sendMessage-activemq11-0.0.1-SNAPSHOT.jar
수신 프로그램
sendMessage() 메소드를 주석 처리 후 jar 형태의 파일로 export 합니다.
그리고 EC2 인스턴스에 업로드를 합니다.
java -jar receiveMessage-activemq11-0.0.1-SNAPSHOT.jar
테스트 스크린샷