Spring Cloud: 39개의 글
AMQP(Advanced Message Queuing Protocol) AMQP는 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜이다. AMQP 이전 상용화된 MQ(Message Queueing)은 플랫폼 종속적인 제품들이 많아, 서로 다른 이기 존 간에 메시지를 교환하기 위해서는 메시지 포맷 변경을 위한 메시지 브릿지 이용 및 시스템 자체를 통일 시켜야 하는 불편함 존재 메시지 브릿지를 이용함으로써 속도 저하 발생 이를 해결하기 위해 AMQP 등장하였으며, 서로 다른 시스템간에 최대한 효율적인 방법으로 메시지를 교환하기 위한 MQ 프로토콜로 설계 시스템과 벤더에 종속 되는 것을 방지 하기 위해 AMQP는 아래와 같은 조건을 충족 해야 함 모든 Broker들은 똑같은 방식으로 동작 할 것 모..
이번 글에서는 Spring Boot를 사용한 Message Reqeust/Reply에 대해 알아보도록 하겠습니다. 1. Request/Reply Request는 message 처리 요청을 의미합니다. Reply는 메세지 처리후의 응답이라고 생각할 수 있습니다. 기본적으로 Consumer는 RabbitMQ로 부터 메세지 처리 요청(Request)이 오면 적절한 프로세스를 통해 메세지를 처리하는 과정을 거치게 됩니다. 처리과정을 거친뒤에는 해당 Consumer에서 아래 그림처럼 다른 서비스의 API를 호출해 또다른 프로세스를 진행할 수 있습니다. 아니면 아래 그림처럼 또다른 메세지를 생성해 적절한 Exchnage로 메세지를 전달 할 수 있습니다. 만약 위처럼 메시지를 또다른 exchnage에 전달하려고하면 ..
이번 글에서는 RabbitMQ의 Message Order와 Multiple Message Type을 다루는 방법에 대해 알아보도록 하겠습니다. 1. Message Order Message Order는 Queue에 들어온 메시지가 처리되는 순서를 의미합니다. 만약 순서대로 처리되어야 되는 메시지가 Queue에 들어올 경우 Message Order는 반드시 지켜져야 합니다. 😅 1-1) One Queue + One Consumer 기본적으로 하나의 Queue에 하나의 Consumer만 존재할 경우에는, RabbitMQ는 메세지 처리순서를 보장합니다. 1-2) One Queue + Multiple Consumer 만약 하나의 Queue에 여러 Consumer가 존재하고, 각각의 Consumer들의 메시지 처리..
이번 글에서는 Spring Boot의 @Scheduled를 사용해 Consumer를 ON/OFF 해보도록 하겠습니다. 1. @Scheduled 먼저 spring boot에서 사용할 수 있는 @Scheduled의 종류를 살펴보겠습니다. 1-1) @Scheduled(fixedDelay = N) 이전 execution으로부터의 delay 시간을 의미합니다. 예를 들어 다음 execution이 실행되는 시간은 이전 execution이 완료된 후 N 시간이 지난이후입니다. 1-2) @Scheduled(fixedRate = N) 어플리케이션이 실행된후 매 N 시간마다 execution을 실행합니다. 예를 들어 0초에 이전 execution이 실행되었다면 0+N 시간 후 다음 execution이 실행됩니다. 1-3)..
이번 글에서는 Spring Boot의 Jackson2JsonMessageConverter를 사용해 손쉽게 Object를 JSON Message Format으로 변경해보겠습니다. 1. Message Converter란? object를 rabbitmq의 message 형식으로 변환해주는 것을 의미합니다. 이전글까지는 Rabbitmq를 통해 메세지를 주고받기 위해, object들을 string 형식으로 변환해야하는 번거로움이 있었습니다. 메세지를 전달할 때 사용하는 RabbitTemplate의 default message convertor(SimpleMessageConverter)가 input data type으로 string을 받기때문입니다. 따라서 아래와 같이 ObjectMapper를 사용해서 object..
이번 글에서는 Java Code로 RabbitMQ Structure를 생성해보겠습니다. 0. RabbitMQ Structure란? Exchange, Queue, Binding 등의 RabbitMQ Server의 구조를 의미합니다. rabbitmq의 structure는 rabbitmq managemenet console에서 GUI를 통해 생성할 수도 있지만, Java code 내부에서도 생성해 사용할 수 있습니다. rabbitmq management console 1. @Configuration Java Code로 RabbitMQ Structure를 생성하기 위해선 config 파일을 생성해야 합니다. 아래와 같이 @Configuration 어노테이션을 선언한 config 파일을 생성합니다. @Config..
이번 글에서는 대표적인 오픈소스 메세지 시스템인 RabbitMQ와 Kafka를 비교해보겠습니다. 1. Message Retention Kafka : by policy Kafka의 메세지 보유기간은 policy에 기반합니다. 설정한 policy 기간 동안에는 메시지가 소멸되지 않습니다. 따라서 동일한 메세지를 반복적으로 처리할 수 있습니다. RabbitMQ : by acknowledge RabbitMQ의 메세지 보유기간은 acknowledge에 기반합니다. ack를 받은 메세지는 사라지게 됩니다. 따라서 처리를 완료한 메세지를 재 처리하고 싶을 경우에는 반드시 producer가 동일한 메세지를 re-publish 해야합니다. 2. Message Routing Kafka : no routing mechani..
이번 글에서는 Spring Boot의 RabbitMQ Retry mechanism에 대해 알아보겠습니다. 0. Retry Mechanism이란? 메시지 처리에 실패했을때 실패한 메시지에 대한 error handling 방법을 구조화한 structure 입니다. 이전 retry mechanism 글(https://velog.io/@minholee_93/RabbitMQ-Retry-Mechanism-nik4tel6hs) 에서는 wait exchange와 retry exchange를 직접 구현해 아래와 같은 구조로 retry mechanism을 설계했었습니다. 하지만, Spring boot에서 제공해주는 기능을 사용하면 wait/retry 없이 간단한 구조로 retry mechanism을 구현할 수 있습니다. ..
이번 글에서는 RabbitMQ Administartion API를 사용해 주기적으로 Dirty Queue를 체크해보겠습니다. 0. Dirty Queue란? Queue 내부에 메시지가 남아있는 Queue를 의미합니다. 일반적인 경우에, 정상적으로 Consumer 들이 Queue의 메세지를 적절히 처리하고 있다면 Queue 내부에 메세지가 쌓여 있지 않습니다. (물론 prefetch 를 낮게 잡았다면 메세지는 consumer의 메모리가 아닌 Queue 내부에서 process를 기다릴 수 있습니다.) 따라서 Queue 내부에 메세지가 대량으로 쌓여있을 경우에는, 무엇인가 잘못되었을 확률이 있습니다. 이를 체크하고 대응하기위해서는 주기적으로 (예를들면 매일 자정) Dirty Queue를 확인한 후 적절한 대응이..
이번 글에서는 Publisher API를 사용해 RabbitMQ에 메세지를 Publish 해보겠습니다. 0. Publisher API를 사용하는이유? RabbtiMQ로 메세지를 Publish 하기전 메세지의 Validation을 check 하기위해 사용합니다. 아래 그림과 같이 기업에서는 무수히 많은 어플리케이션이 RabbitMQ Message Server를 통해 메세지를 주고받습니다. 때문에 통합된 규격의 메세지 Validation을 활용할 필요가 있습니다. 따라서 모든 메세지는 RabbitMQ 서버에 Publish 하기전에 Validation API를 거치도록 구현해야 합니다. 이를 Publisher API라고 하며 Spring Boot에서는 RestController의 PostMapping으로 구현..