본문 바로가기

MY개발생각

[개발생각] ActiveMq에서 Topic을 Queue방식으로 컨슘하기

이번주에 삽질을 한부분을 글로 남겨둔다.ㅠ 셋팅문제긴했지만, ActiveMq는 사실 십몇년전에 레포트만들때 잠깐 사용한게 전부,

 

ActiveMq에 Topic을 컨슘을 해야했다. 컨슘을 했고, 컨슈머를 이제 늘려서 성능을 높이려고 늘려서 테스트를 하는데,

같은 데이터가 컨슈머 갯수만큼 들어왔다. 이상하다라고 생각이 들어서, 확인해보니,

ActiveMq에서의 Topic은 Fan-Out방식으로 동작을 한다는것을 알았다.

(하나의 이벤트를 여러 컨슈머가 동일하고 소비하는 방식)

즉, 같은 이벤트를 동일하게 컨슘하는 방식이고, 여러 컨슈머가 서로 다른 이벤트를 소비하려면,

Queue방식으로 컨슘을 해야한다는것을 알았다.

 

참... 토픽, 큐 정의 명확히 통일좀 시켜주면 안될까..ㅋㅋ

카프카, 레빗엠큐, 액티브엠큐에서 의미하는것이 조금씩 틀려서 헷갈릴때가 많다..

 

암튼, ActiveMq에서 Topic을 Queue방식으로 컨슘을 하기위해서는 몇가지 방법이 있다.

그중에서 가장 쉽고 많이 쓰는 방법인 Virtual Topic에 대해서 이야기를 하려고 한다.

 

Virtual Topic는 RabbitMq에서 라우터(Exchange) 역할을 하는 기능이라고 생각하면 될듯하다.

사용법은 아래와 같다.

 

VirtualTopic.토픽이름

 

이렇게 정의해서 사용하면 되는데, VirtualTopic.프리픽스가 붙게되면,

해당 토픽은 Queue로 자동으로 라우팅이 되게 해준다.

 

 

해당 토픽을 Queue방식으로 컨슘하려면 아래와 같다.

 

Consumer.그룹ID.VirtualTopic.토픽이름

 

이렇게 컨슘을 하면, 

"VirtualTopic.토픽이름"에 발행된 이벤트가 "Consumer.그룹ID.VirtualTopic.토픽이름"이름으로 큐가 생성되고,

해당 큐로 이벤트가 라우팅 되고, 해당 큐를 컨슘하게 되면, 이제는 여러 컨슈머가 다른 이벤트를 컨슘할수있게 된다.

 

여기서 한가지 궁금증이 있을것이다.

아니 그러면 그냥 처음부터 큐만들어서 해당 큐로 컨슘하면 되지 왜, 불편하게 VirtualTopic을 만들고,

Consumer 머시기머시기하는 규칙으로 컨슘을 하나? 라는 생각을 할수있는데, 여기서 가장 큰 장점이 있다.

 

VirtualTopic기능을 사용하면, 이벤트를 그룹ID기준 Queue로 라우팅을 해준다는 것이다.

 

예를 들어보면)

VirtualTopic.User라는 토픽을 만들었고, 해당 토픽으로 이벤트가 들어오고 있는 상황인 경우,

해당 토픽을 A라는 서비스와 B라는 서비스가 각각 컨슘을 해서 별도의 기능에 사용하고 싶다고 했을대,

 

"Consumer.A.VirtualTopic.User"

"Consumer.B.VirtualTopic.User"

 

라고 A서비스와 B서비스가 각각 Queue를 컨슘하게되면,

해당 이벤트는A,B라른 그룹아이디기준으로 별도의 Queue되여 메세지가 복제된 상태를 유지해 주기때문에,

이후부터는 별도로 이벤트를 컨슘할수있게된다.

 

여기서 VirtualTopic를 사용하지않고, Queue를 바로 사용하는 경우에는,

즉, Queue로 바로 컨슘을 하게된다면, 라우팅을 할수없게되기에, A,B가 이벤트를 나눠서 컨슘하게 된다...

아니면, 발행시에 Queue를 두군데에 모두 동일하게 발행을 하는 방식을 쓰던지 해야한다 (구리지..)

 

결국은 VirtualTopic에서 groupId를 설정할수있기에, 분산 컨슘이 되는것이라고 이해해도 되겠다.

 

개인적으로는 ActiveMq보다는 RabbitMQ가 더 나은것 같다.

(RabbitMQ가 훨씬 기능도 많고, 좋다!!!)

Kafka, RabbitMq 정도를 용도에 맞게 잘사용하면 웬만한 비즈니스적 설계는 커버가 된다..