본문 바로가기
Spring

[Spring] Amazon MQ (Active MQ) : Virtual Destinations 기능

by 가드 2022. 11. 10.
728x90

Active MQ Queue 메시지 전달 방식에  대한 새로운 요구조건이 발생되어 조건을 충족시키기 위해 Active MQ의 Virtual Destinations 기능을 사용해서 해결한 내용을 기록하고자 한다.

 

Message 방식을 Queue로 되어 있었고 Round Robin 방식으로 Consumer가 한 번씩 돌아가며 Message를 받아 처리하고 있는 구조였다. (Active MQ Consumer 운영 포스팅을 참고)

Producer와 Consumer는 서버가 분리되어 있지만 같은 제품 서비스이기도 했고 Producer에서 보내는 Message는 같은 제품 서비스의 Consumer 서버만 수신받도록 되어 있었다.

Message 수신에 대한 요구 조건

activemq

 

위의 이미지와 같이 A 제품 서비스의 Consumer들만 Message를 수신을 받았는데 B 제품 서비스, C 제품 서비스 군도 동일한 메시지를 수신 될 수 있게 기능 변경 요청이었다.

간단하게 생각하면 Queue를 Topic으로 변경하면 어떠한 제품군의 서비스도 동일한 메시지를 받을 수 있다라고 생각될 수 있는데 A 제품군의 Consumer는 반드시 하나의 Message가 하나의 Consumer에서만 처리가 되어야 하는 구조였기 때문에 Topic으로 변경이 불가했다.

기존 Queue Consumer 구조는 두고 동일한 Message를 받을 수 있는 Topic을 새롭게 정의해서 다른 제품 서비스 들이 Message를 받을 수 있도록 하는 것도 하나의 방법이긴 할 텐데 관리 포인트도 늘어나고 Producer에서 Message를 서로 다른 DESTINATION으로 두 번 Broker에 전달하는 것도 원치 않는 방식이기도 했다.

 

결론을 이야기하자면 Acvice MQ에서 제공하는 Virtual Destinations 기능을 사용하여 해결하였다.

 

activemq virtual

 

Virtual Destinations를 사용하면서 위의 구조로 변경이 되었고 관리 포인트 없이 최소한의 변경으로 요구 사항을 충족시켰다.

Virtual Topics은 Topic과 유사하지만 Logical Topic과 Physical Queue를 생성해준다. 그래서 Publisher는 Logical Topic으로 Message를 발행하고  Logical Topic을 Subscriber가 구독하기 시작하면 Broker에서 해당 Subscriber만을 위한 Physical Queue가 자동으로 생성된다.

  • A 제품 서비스는 기존대로 Queue 방식으로 Round Robin으로 Consumer에게 Message에 할당되어 처리
  • B 제품, C 제품 서비스들은 동일한 Message를 수신

Virtual Destinations로 변경하면서 장점은

  • 기존 방식에서 Topic의 명칭만 변경하면 돼서 변경이 간단하다
  • Pub-Sub 방식으로 Subscriber가 증가해도 Publisher 수정이 불필요하다
  • Queue에서 Message 처리하기 때문에 자유로운 Scale In/Out으로 인한 중복 방지

Virtual Destinations 설정 방법

1. Amazon MQ(Active MQ)의 Drive Profile 수정

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<broker useVirtualTopics="true" schedulePeriadForDestinationPurge="10000" shedulerSupport="true" 
	<detinationInterceptors>
    	<virtualDestinationInterceptor>
        	<virtualDestinations>
            		<virtualTopic name="&gt;" prefix="VirtualTopicConsumers.*." selectorAware="flase"/>
        	<virtualDestinations>
    	<virtualDestinationInterceptor>            
	<detinationInterceptors>

borker 설정을 useVirtualTopics="true"과 virtualTopic에 prefix를 추가해주면 된다.

 

2. Spring 설정

  • Topic destination 이름 앞에 "VirtualTopic."를 prefix로 붙여준다.
  • Consumer : Amazon MQ Profile 구성에서 정의한 virtualTopic의 prefix값을 @JmsListener의 destination에 prefix로 붙여준다
@JmsListener(destination="VirtualTopicConsumers.{topic destination명}")

Virtual Destinations 사용 시 Topic과 Queue 방식을 혼용하여 사용할 수 있었다.

응용할 수 있는 방법이 다양해서 상황에 따라 구성이 가능한 것으로 보인다.

300x250

댓글