[Java/Spring] Spring Cloud Stream의 이해 - 1
in Devlog on Java & Spring, Spring, Springboot, Spring-cloud-stream, Messagebroker
비동기기술, MQ ( 메세지큐잉 ), Spring Cloud Stream
비동기 방식
- 좋은 블로그: http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/index.html
 
Message Queuing
시스템간 결합을 최대한 느슨하게 유지한 채로 상호 정보 - 데이타, 신호 - 를 주고 받을 수 있는 방식.
 이 기술을 지원하는 라이브러리, 솔루션들을 ‘Message Broker’로 부름.
대표적인 MQ 라이브러리
- RabbitMq, Apache Kafka, Amazon SQS, SNS, AmazonMq(ActiveMq)
 
MQ 기본개념
- 프로토콜
- AMQP, STOMP, MTQQ, TCP/IP
 
 - Connection : 발생자와 소비자, Broker 사이의 물리적인 연결
 - Channel - 외부에서 메세지 브로커를 통해 메세지를 주고받을 수 있는 채널, 논리적인 연결고리 (발행시스템과 구독시스템은 채널을 통해 Queue에 접근 )
 - Exchange - 메세지의 라우팅 규칙(교환자), 실제 메세지를 담는 Queue와 바인딩 됨.
 - Queue - 메세지의 최종 목적지
 
대표적인 메세지브로커 (external message broker)
- Rabbit MQ
- 가장 범용적이고, 널리 사용되는 오픈소스 메세지 브로커 (35,000개 이상)
 - 강력한 메세지 라우팅 기능, Queue의 다양한 옵션 설정
 - Supports multiple messaging protocols, message queuing, delivery acknowledgement, flexible routing to queues, multiple exchange type.(direct, topic, )
 
 - Amazon SQS / SNS
- 메세지 브로커를 설정할 필요없는 단순 대기열(queue)과 주제(topic) 서비스
 - 단순히 Queue용도로만 사용할 경우 적절한 대안이 될 수 있음. 메세지 라우팅 기능, 채널 그룹핑기능 없음.
 - 관련문서: https://www.baeldung.com/aws-queues-java
 
 - Amazon MQ (Apache MQ)
- Apache ActiveMQ 기반의 클라우드 기반 메세지 브로커
 - 표준 프로토콜 모두 지원 ( 향후 ApacheMQ뿐만이 아니라 다른 Third-Party 추가될 가능성 )
 - 브로커의 생성, 이중화(Active-Standby), 모니터링(CloudWatch)를 AWS기반에서 간단하게 구성할 수 있음 (매우 매력적인 장점)
 - 레퍼런스 문서: https://docs.aws.amazon.com/ko_kr/amazon-mq/latest/developer-guide/welcome.html
 
 - Apache Kafka
- 범용 메세지 브로커중에서는 가장 뛰어난 성능
 - 통신프로토콜이 TCP/IP방식임
 - 메세지 전송보장
 
 
RabbitMQ. Kafka 와 AmazonMq와의 가장 큰 차이점은
- RabbitMQ. Kafkas는 spring-cloud-stream에서 제공하는 단순화돤 공통 어노테이션을 통해 구현.
 - AmazonMq는 spring-cloud-stream 기반의 바인딩 및 Pub/Sub 구현이 안됨. JMS 방식으로 바인딩 및 메세지교환처리 구현. 즉, 사용하는 어노테이션이 틀림. (추가될 가능성은 있음)
 - 예제를 통해 확인이 가능
 
Spring Cloud Stream
메세지가반 마이크로 서비스간 연결과 정보 교환 위한 프레임워크
Spring Integration이 메세지브로커(RabbitMQ, Kafka)와의 중계를 담당
연계에 필요한 추상화 인터페이스 제공
@EnableBinding어노테이션 선언으로 메세지브로커에 연결됨.@StreamListener선언시 스트림처리를 위한 이벤트 수신Source,Input인터페이스를 통해 큐/토픽과 쉽게 연결
주요 인터페이스
- Sink: Identifies the contract for the message consumer by providing the destination from which the message is consumed.
 - Source: Identifies the contract for the message producer by providing the destination to which the produced message is sent.
 - Processor: Encapsulates both the sink and the source contracts by exposing two destinations that allow consumption and production of messages.
 

- Springboot 기반으로 간편하고 직관적인 어노테이션으로 빠른 개발이 가능
 - 개발자는 메세지브로커의 커넥션, 설정등에 신경쓰지 않고 비즈니스 로직에 집중할 수 있음
 

왜 메세지 기반 (Messaga-Driven) 기술이 필요한가?
- 느슨한 결합이 가능하므로 분산시스템, 마이크로서비스간 협업 관계에 있어 상호 의존성을 배제 할 수 있다.
 - 상대시스템의 성능, 서버 상태에 전혀 영향을 받지 않는다.
 - 서로 시스템 정보를 몰라도 메세지 브로커 시스템간 메세지 교환-상호간 정보 교환-이 가능하다.
 - API 방식의 경우, 목적지 시스템의 성능과 서버의 상태에 직접적인 영향을 받기 때문에 예외처리, FallBack처리가 필수
 - 상대 시스템은 서로 독립적으로 인스턴스를 증가 감소할 수 있다.
 - 상호 정보 교환을 하는 시스템들은 서로가 어디에 위치하는지 (Endpoint가 어디인지), 어떤 기술기반인지 관심을 가질 필요가 없다. 알지 못한다. 오로지 메세지 전송(Pub) 과 수신(Sub)에만 관심을 가지면 된다.
 
