ActiveMQ에서 메시지를 소비 할 때 메시지 순서를 어떻게 보존합니까?

StackOverflow https://stackoverflow.com/questions/426532

  •  06-07-2019
  •  | 
  •  

문제

ActiveMQ 클라이언트를 사용하는 .NET 서비스가 있습니다. 메시지를 소비하기 위해 거래 된 연결이있는 Messagelistener를 구현했습니다.

때때로, 나는 그들이 큐에 놓인 다른 순서로 메시지를 얻습니다.

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

참고 : 한 명의 프로듀서가 대기열에 메시지를 넣고 한 명의 소비자가 대기열에서 메시지를 당기는 소비자가 있습니다.

도움이 되었습니까?

해결책 2

더 많은 정보 : 내가 호출하는 서버는 타사이며 보내는 메시지를 제어 할 수 없습니다. 메시지 ID를 기반으로 올바른 순서로 사용된다는 것을 알고 있습니다. 또한이 시스템에서 ACK와 인정 사이에는 차이가 있습니다. 내 원래 메시지가 "아웃 바운드"대기열에 올 때 ACK가 접수됩니다. 그런 다음 응답을 위해 "인바운드"대기열을 모니터링합니다. 나는 보통 "승인"과 "패스"또는 "실패"를 얻습니다. 이 메시지의 상관 ID는 ACK의 메시지 ID입니다.

나는 원래 메시지 청취자를 사용했고 OnMessge 이벤트에 응답했습니다. 이 방법을 사용하여 메시지가 비동기 적으로 전달되어 특정 순서로 전달된다는 사실을 깨닫고이 접근법을 포기했습니다. 따라서 Timer (System.threading.timer)를 사용하여 코드를 설문 조사로 변경하여 소비자를 호출하고 한 번에 하나의 메시지를받습니다. 이것은 내가 원하는 방식으로 작동합니다.

서비스가 시작될 때 소비자를 한 번 열고 메시지를 지속적으로 설문 조사합니다.

다른 팁

주문을 유지하기 위해 아무것도 할 필요는 없습니다. 그것은 메시지 대기열이 당신을 위해하는 것 중 하나입니다. 단일 소비자가 대기열을 듣고 있고 순서대로 메시지를 처리하고 있다면 버그를 찾거나 메시지가 생각하는 순서대로 quequeed되지 않는다고 생각합니다.

또한, 거기 있습니다 이 질문 ~로부터 ActiveMQ FAQ 도움이 될 수 있습니다.

편집하다: 의견을 읽는 것 Duffymo의 대답, 당신이 약간 과잉가 인 것처럼 보입니다. 일반적으로 ActiveMQ, MQ Series, Joram 등과 같은 메시지 대기열에는 두 가지 특성이 있습니다. 메시지가 적용되는 순서와 동일한 순서로 메시지를 전달하고 메시지 전달을 보장합니다. 별도의 ACK 메시지를 보내는 것이 중복됩니다. 데이터베이스 트랜잭션을 커밋 한 다음 데이터베이스가 실제로 저장 한 것과 동일한 정보를 다시 다시 확인하기 위해 동일한 정보를 쿼리하는 것과 비슷합니다.

그렇게 말하면 서버가 멀티 스레드입니까? 그렇다면 응답을 수용 할 수 있습니다. ~ 전에 ACK를 흡수합니다.

메시지 순서가 중요한 이유는 무엇입니까? Messagelistener는 신경 쓰지 않아도됩니다.

특정 요청과 응답과 일치하기 위해 상관 관계 ID가 필요한 경우 또 다른 문제입니다. 이게 네가 말하는거야?

제이슨이 방금 말한 모든 것. 조심해야 할 몇 가지 다른 것들. 당신은 많은 메시지를 위해 소비자를 열어두고 있습니까? 당신은 몇 가지 메시지를 위해 소비자를 만들지 않고 그것을 닫습니다. 소비자 만 닫으면 소비자와 관련된 메시지가 순서를 끊을 수있는 대기열로 되돌려 놓습니다.

롤백과 관련이 있습니까? (거래를 롤백하고 있습니까?).

마지막으로, 당신은 항상 Resequencer 당신을 위해 물건을 재주문합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top