- 관련 연구 1 - 기본 개념
스프링 클라우드(Spring Cloud), MQ(Message Queuing) 를 연동한 서비스 도입 사례를 공유합니다.
관련 연구 1 - 기본 개념 (현재글)
관련 연구 3 - Spring Cloud Stream, RabbitMQ 연동
도입 사례 1 - Spring Cloud Stream, RabbitMQ 실제 서비스 연동
도입 사례 2 - 예상했던, 예상하지 못했던 추가 작업
부록 A - Spring Cloud Stream 버전 이슈
정리
사내 서비스 개선사항이기 때문에 공개하기 어려운 대외비는 내용에서 제외하였습니다. 서비스 아키텍처는 외부에 공유해도 되겠다는 판단으로 공유합니다. 개선사항 의견을 말씀해 주시면 감사드리겠습니다.
이전 포스팅 https://brunch.co.kr/@springboot/2
상세 연구 및 도입사례를 작성하기 전에 기본 개념(배경 지식)을 정리해봤습니다. 상세한 내용보다는 간략한 소개 정도로 정리할 예정입니다. 2년차 이상 되시는 개발자 분들은 이 글은 너무 쉽거나 설명이 불친절하여 넘어가셔도 좋으며, 상세 내용은 다른 참고자료를 참고 부탁드립니다. 웹서비스 신입 개발자분들은 한번 쯤은 읽어볼만할 것 같습니다.
느슨하게 결한된 시스템 사이에서 상호 정보 교환이 가능한 Message(메시지) 전달 방식을 MQ(Message Queuing, 메시지 큐잉) 이라고 합니다.
일반적인 웹서비스에서의 요청-응답(Request-Response) 방식은 서버-클라이언트 사이의 통신 방법으로 주로 사용 됩니다. 해당 시스템은 의존성(결합도)가 높은 시스템 구조이며, 동기방식으로 동작합니다.
MQ 연동 연동 시스템에서의 서버는 메시지를 발행(전달) 하는 생산자(PUB...) 의 역할을 하고, 클라이언트는 메시지를 받는 소비자(SUB...) 의 역할을 합니다. 이때 MQ 브로커(Broker)는 두 지점을 연결하는 중재자 역할을 합니다. 해당 시스템은 의존성이 높지 않고 느슨한 결합된 시스템 구조이며 비동기 방식으로 동작합니다.
느슨한 결합 시스템은 마이크로서비스 아키텍처와도 관련이 있습니다. 어떤 방식이 바람직한지(좋다,나쁘다)를 이 글에서 논하는 것은 주제와 맞지 않아서 자제할려고 합니다. 어떤 방법이던 정답은 없고 시스템의 상황에 맞게 구성을 하는것이 정답이라고 생각합니다.
관련해서는 아래 링크를 참고 부탁드립니다.
https://content.pivotal.io/blog/messaging-patterns-for-event-driven-microservices
대표적으로 많이 사용하는 RabbitMQ 와 아파치 Kafka 입니다. 최근에는 AWS SQS(Simple Queue Service) 도 많이 사용하는 걸로 알고 있습니다.
https://content.pivotal.io/blog/understanding-when-to-use-rabbitmq-or-apache-kafka
https://yurisubach.com/2016/05/19/kafka-or-rabbitmq/
https://www.quora.com/What-are-the-differences-between-Apache-Kafka-and-RabbitMQ
MQ 미들웨어 도입을 위해 RabbitMQ, Kafka, SQS 중 뭘 도입해야할지 고민을 많이 하였습니다. 작년에 잠시 개인스터디로 추천시스템의 대용량 트래픽의 이벤트 로그 수집에 대한 관심이 있어서 Kafka 를 공부한 적이 있었습니다. 또한 각종 세미나에서 Kafka 도입 사례를 많이 봤기 때문에 개인적으로는 Kafka 에 대한 관심(니즈)가 있어서 실제로 포털시스템과의 연동 개발도 구현했고 Message 전송도 테스트를 완료하였습니다. Kafka 는 대용량 이벤트 처리가 가능하며 100k/sec 의 빠른 성능을 발휘합니다. 하지만 이번 작업에 Kafka 가 적합한지는 많은 고민이 필요했습니다. 이번 도입은 끊임없이 발생하는 스트리밍 이벤트 처리 보다는 두 지점(콘텐츠 API, 포털시스템) 간의 정교한 Message 교환에 초점을 맞춰야 합니다. 또한 Message 브로커 중심적이어야 하며 브로커는 두 지점간의 커뮤니케이션 관리를 반드시 해야 합니다. 그리고 중요한 것은 Message 는 단순 토픽이 아니라 다양하고(복잡한...) 확장성 있는 Message 라우팅이 가능해야 하기 때문에 RabbitMQ 의 Exchange 개념이 필요했습니다. 게다가 저희 팀에서 다른 서비스에서도 RabbitMQ 를 쓰고 있는 상황이라서 미들웨어 운영 인력 리소스에 대한 고려도 같이 포함되었습니다. 신규 미들웨어를 도입하는 것은 많은 고민은 필요합니다.
고민 끝에 RabbitMQ 를 도입하기로 결정!
단, 마이크로서비스에 대한 개념이 아직 완벽하지 않은 상황이라서 RabbitMQ 가 마이크로서비스 아키텍처에 적합한지는 아직 모르겠습니다. (확실한건 아니지만)독립적이고 분산된 시스템의 마이크로서비스에서는 Smart endpoints & Dumb pipes 가 요구된다고 알고 있습니다. 하지만 위에 설명한 대로 RabbitMQ는 브로커 중심적인 Smart Pipes 이기 때문입니다. 어쨋든 저는 정답은 없다고 생각하며 현재 시스템과 개발팀의 상황 등을 전체적으로 고려해서 결정해야한다는 생각입니다.
참고로 스프링 클라우드 와 Kafka 연동 사례도 있으니 아래 영상 참고 부탁드립니다.
https://www.youtube.com/watch?v=bsPBVoxBhq0
스프링 클라우드(Spring Cloud)는 분산시스템의 공통 패턴을 빠르게 구축할 수 있는 스프링 프레임워크 기술입니다. 전체 내용을 이 글에서 작성하기는 무리가 있을 것 같습니다. 아래 공식 레퍼런스 사이트를 참고하시면 됩니다.
http://projects.spring.io/spring-cloud/
스크링 클라우드 기술 중에서 Spring Cloud Stream은 메시지 기반 마이크로 서비스를 구현하기 위한 프레임 워크입니다. Spring Cloud Stream은 Spring Boot를 기반으로 DevOps 친화적인 마이크로 서비스 애플리케이션을 만들고 Spring Integration은 메시지 브로커와의 연결을 제공합니다. Spring Cloud Stream은 메시지 브로커의 독창적인 구성을 제공하여 여러 미들웨어 공급 업체에 pub/sub, 소비자 그룹 및 파티션 개념을 도입합니다. 이 독창적인 구성은 스트림 처리 응용 프로그램을 만드는 기초를 제공합니다. 응용 프로그램에 @EnableBinding을 추가하면 메시지 브로커에 즉시 연결되며 메서드에 @StreamListener를 추가하면 스트림 처리를 위한 이벤트가 수신됩니다.
라고... 공식 설명이 되어있습니다. 번역했습니다.
https://cloud.spring.io/spring-cloud-stream/
Spring Cloud Stream 샘플 소스는 아래 링크를 참고하시면 됩니다.
https://github.com/spring-cloud/spring-cloud-stream-samples
스프링 부트는 권용근님의 스프링캠프 세미나 영상을 참고하시면 됩니다.
https://www.youtube.com/watch?v=52i6gHnS1_g
스프링 클라우드, 스프링 부트 등 기술은 모두 스프링 마이크로서비스 아키텍처와 밀접한 연관이 있습니다. 이번 글에서는 모두 작성할 수는 없지만 앞으로 기회가 된다면 스프링 마이크로서비스 라는 주제로 계속 스터디를 할 예정입니다.
이번 글에서는 [관련 연구 1 - 기본 개념] 에 대해서 글을 작성해봤습니다. 수박 겉핥기로 간단한 소개 정도로만 글을 마무리해서 아쉽게 생각합니다. 다음 글에서는 [관련 연구 2 - RabbitMQ] 이라는 주제로 글을 쓸 예정입니다. [관련 연구 2 - RabbitMQ] 에서는 RabbitMQ 에 대해서 상세하게 다룰 예정입니다.
다음 글
https://brunch.co.kr/@springboot/6