JMS는 비동기 메시징 형식이므로 게시자와 구독자는 의도적으로 연결이 끊어집니다. 이것은 당신이 원하는 것을 할 수있는 메커니즘이 없다는 것을 의미합니다. 게시 시점에 활동중인 가입자의 경우, 제 시간에 삭제 메시지를 수신 할 기회없이 메시지를 사용합니다. 구독자가 오프라인이면 비동기 메시지는 원 자성을 갖습니다. 다른 응답자의 답을 디자인 할 때 (삭제 메시지를 작성하고 삭제 메시지를 찾기 위해 전체 대기열을 읽도록 다시 연결해야하는 경우) 구독자의 여부에 따라 시스템의 동작이 달라지는 상황이 발생하게됩니다 특정 메시지/삭제 조합이 게시 된 당시 온라인 상태인지 아닌지를 나타냅니다. 또한 게시자가 삭제 메시지를 전송하기 바로 전에 구독자가 보존 된 메시지를 읽는 경쟁 조건이 있습니다. 즉, 이러한 조건을 조정하고 경쟁 조건을 조정하기 위해 가입자에게 중요한 로직을 추가해야합니다.
이것을 수행하는 허용 된 방법은 "보상 거래"입니다. 생산자와 소비자가 하나의 작업 단위를 공유하지 않거나 공통 상태를 공유하지 않는 시스템 (예 : 동일한 DB를 사용하여 상태를 저장하는 시스템)에서 이전 트랜잭션을 취소하거나 수정하는 경우 첫 번째 트랜잭션을 반전하는 두 번째 트랜잭션이 필요합니다. 물론 소비자는 보상 거래를 올바르게 적용 할 수 있어야합니다. 이 패턴을 사용하면 소비자가 다시 시작된 후에 메시지가 실시간으로 또는 일괄 적으로 소비되는지 여부에 관계없이 모든 구독자가 동일한 동작을 보입니다.
보상 트랜잭션은 "메시지 삭제"와 다릅니다. 다른 응답자의 응답에서 제안 된 삭제 메시지는 메시지 스트림 자체에 영향을주는 명령 및 제어 형식입니다. 반면 보상 트랜잭션은 시스템 상태의 트랜잭션 업데이트를 통해 시스템 상태에 영향을줍니다.
일반적으로 은 명령 및 제어 기능으로 메시지 스트림을 조작하여 시스템 상태를 관리하려고합니다. 이것은 깨지기 쉽고 공격 받기 쉽고 감사 또는 디버그하기가 매우 어렵습니다. 대신 시스템이 모든 메시지를 서비스 제약 조건에 따라 전달하고 모든 메시지를 처리하도록 설계하십시오. 애플리케이션에서 상태 변경 (이전 동작 반전 포함)을 처리합니다.
예를 들어, 거래가 당좌 대월 수수료와 같은 2 차 효과를 유발하는 은행 업무에서 일반적인 절차는 당일 거래를 "메모 게시"한 다음 은행이 폐쇄 된 후에 일괄 적으로 정렬하고 적용하는 것입니다. 이를 통해 의 실수를 전에 조정할 수 있으므로 당좌 대월 수수료가 발생합니다. 최근에는 트랜잭션이 실시간으로 적용되지만 트리거는 하루의 책이 마감 될 때까지 보류되며 이는 동일한 결과를 얻습니다.
+1, 귀하의 답변을 읽는 것이 항상 즐겁습니다. – MaDa
고마워, 친절한 단어들! –