2009-01-08 3 views
3

ActiveMQ 클라이언트를 사용하는 .NET 서비스가 있습니다. 메시지를 소비하기 위해 거래 연결이있는 MessageListener를 구현했습니다.ActiveMQ에서 메시지를 소비 할 때 메시지 순서를 어떻게 보존합니까?

가끔 메시지를 대기열에 넣은 순서가 다릅니다.

MessageListner를 사용하는 것이 잘못 되었습니까? 메시지 순서를 보존 할 수있는 방법이 있습니까?

FYI : 한 명의 생산자가 대기열에 메시지를 넣고 한 명의 소비자가 대기열에서 메시지를 가져옵니다.

+0

문제에 대한 배경 정보는이 스레드를 참조하십시오. http://stackoverflow.com/questions/269363/activemq-net-client-locks-up – HitLikeAHammer

답변

1

추가 정보 : 제가 말한 서버는 제 3 자이며 어떤 메시지를 보내는 지 제어 할 수 없습니다. 나는 그들이 올바른 순서로 넣어지는 메시지 ID를 기반으로 알고 있습니다. 또한이 시스템에서는 ACK와 Acknowledge간에 차이가 있습니다. 원본 메시지가 "아웃 바운드"큐에 저장되면 ACK가 수신됩니다. 그런 다음 응답에 대한 "인바운드"큐를 모니터링합니다. 나는 보통 "Acknowledge"다음에 "Pass"또는 "Fail"이옵니다. 이 메시지의 상관 ID는 ACK의 메시지 ID입니다.

원래 메시지 수신기를 사용하고 OnMessge 이벤트에 응답했습니다. 이 방법을 사용하면 메시지가 비동기 적으로 전달되므로 특별한 순서없이 전달된다는 것을 알고 난 후에이 접근법을 포기했습니다. 그래서 타이머를 사용하여 폴링하도록 코드를 변경하여 (System.Threading.Timer) 소비자에게 호출합니다.수신()하고 한 번에 하나의 메시지 만 가져옵니다. 이것은 내가 원하는대로 작동합니다.

서비스가 시작될 때 소비자가 한 번 열리고 메시지를 계속 폴링합니다.

0

메시지 순서가 중요한 이유는 무엇입니까? MessageListener는주의 할 필요가 없습니다.

응답을 특정 요청과 일치 시키려면 상관 ID가 필요하다면 다른 문제입니다. 이게 네가 말하는거야?

+0

메시지가 대기열을 통해 서버로 전송되고 서버가 다른 대기열에서 해당 메시지에 대한 응답을 되돌립니다. 나는 2 개의 응답을 얻는다. 먼저 "Acknowledge"라고 쓰여진 메시지와 "Pass"(또는 Fail) 메시지가 나온다. 모두에 동일한 상관 ID가 있습니다. 때로는 "확인"메시지가 마지막에 나옵니다. – HitLikeAHammer

+2

나쁜 디자인, IMO. ACK는 동기식이어야하며 "귀하의 요청을 받았으며 처리 될 것"이라고 말합니다. 서블릿과 같은 동기화 프로세서를 사용하여 대기열에 요청을 넣을 수 있습니다. 그러면 그것은 단지 하나의 req/res pair이고 correlation ID는 무엇인가를 의미합니다. – duffymo

1

주문을 유지하기 위해 아무 것도하지 않아도됩니다. 그것이 메시지 큐가 당신을 위해하는 일 중 하나입니다. 단일 사용자가 대기열을 듣고 순서가 잘못된 메시지를 처리하는 경우 버그가 발견되었거나 메시지가 대기열에 있다고 생각하는 순서로 생각할 것입니다.

또한 ActiveMQ FAQthis question이 도움이 될 수 있습니다.

편집 :duffymo's answer에 대한 의견을 읽은 것으로부터 약간의 과장된 것처럼 보입니다. 일반적으로 ActiveMQ, MQ Series, joram 등과 같은 메시지 대기열에는 두 가지 특성이 있습니다. 메시지 대기열은 대기열에 들어있는 순서와 동일한 순서로 메시지를 전달하며 메시지 전달을 보장합니다. 별도의 ACK 메시지를 보내는 것은 중복됩니다. 마치 데이터베이스 트랜잭션을 커밋 한 다음 동일한 정보를 다시 쿼리하여 데이터베이스가 실제로 저장했는지 다시 확인하는 것과 비슷합니다.

당신의 서버는 멀티 스레드입니까? 그렇다면 전에 응답 을 큐에 넣을 수 있으며 ACK를 대기열에 넣을 수 있습니다.

0

제이슨이 방금 말한 모든 것. 조심해야 할 몇 가지. 소비자가 많은 메시지를 열어 두는 것이 맞습니까? 몇 가지 메시지에 대한 소비자를 생성하지 않고 닫는 중입니까? 소비자 만 닫으면 소비자와 관련된 메시지가 주문을 깨뜨릴 수있는 대기열로 되돌아갑니다.

롤백과 관련이 있습니까? (트랜잭션을 롤백하고 있습니까?).

마지막으로 Resequencer을 사용하여 언제든지 순서를 변경할 수 있습니다.

관련 문제