RabbitMQ를 사용하는 과정에서 일부 업무 시나리오에서는 순차적인 소비를 보장해야 하는 경우가 있습니다. 예를 들어, 데이터 추가, 수정 및 삭제 작업을 수행하기 위해 세 개의 메시지가 생성되는 비즈니스 시나리오에서 소비 순서가 보장되지 않으면 실행 순서가 삭제, 수정, 추가로 바뀌어 문제가 발생할 수 있습니다.
아래와 같이:
RabbitMQ에서 메시지 순서 문제는 메시지 전송 순서, 대기열 내 메시지 순서 및 메시지 소비 순서 세 가지 측면에서 고려해야 합니다.
메시지 전송 순서
대부분의 비즈니스에서는 메시지 송신 측에서 메시지 전송 순서가 엄격히 요구되지 않습니다. 먼저 메시지를 보내는 것은 중요하지 않습니다. 메시지가 순차적으로 전송되어야 하는 경우 전역 잠금으로 한 번에 한 개의 메시지만 보낼 수 있도록 하고, 메시지는 동시에 보낼 수 없도록 해야 합니다.
대기열 내 메시지 순서
RabbitMQ에서 메시지는 최종적으로 대기열에 저장됩니다. 동일한 대기열 내에서는 먼저 온 것이 먼저 처리되는 FIFO 원칙에 따라 메시지가 순서대로 정렬되며, 이는 RabbitMQ에서 보장되므로 대부분 개발자들이 이에 대해 걱정할 필요가 없습니다.
참고: 서로 다른 대기열의 메시지 순서는 보장되지 않습니다. 예를 들어 지하철역에 들어갈 때 세 개의 대기열 중 하나를 선택하면 서로 다른 대기열 사이에서는 입장 순서가 보장되지 않습니다.
메시지 소비 순서
메시지 순서 보장에 대해 논의할 때 일반적으로 메시지를 읽는 소비자의 순서를 의미합니다. 동일한 메시지 대기열에서 여러 소비자가 메시지를 소비하는 시나리오에서는 일반적으로 메시지 순서를 보장할 수 없습니다. 처음 그림에서 보듯이 메시지 대기열에는 순서가 있지만, 여러 소비자가 동시에 메시지를 소비하면 메시지를 검색하는 속도, 비즈니스 로직을 실행하는 속도 및 가능한 실행 예외로 인해 일관된 메시지 순서가 보장되지 않을 수 있습니다.
예를 들어: 메시지 A, B 및 C가 순차적으로 대기열에 들어갑니다. 소비자 A1은 메시지 A를 가져가고, 소비자 B1은 메시지 B를 가져갑니다. 그러나 소비자 B1이 더 빨리 실행되면, 소비자 A1 이전에 완료될 수 있거나, 소비자 A1에 오류가 발생하면 두 가지 경우 모두 일관된 메시지 순서가 보장되지 않을 수 있습니다.
순차적으로 소비하는 문제에 대한 전형적인 해결책은 대기열에 소비자를 하나만 두는 것입니다. 이렇게 하면 메시지가 순서대로 하나씩 처리됩니다. 단점은 동시성 능력이 감소하고, 동시 메시지 소비가 불가능하다는 것입니다. 이것은 교차로의 선택이 됩니다.
참고: 비즈니스가 순차적인 소비와 높은 동시성을 요구하는 경우 일반적인 접근 방법은 여러 대기열을 활성화하는 것입니다. 비즈니스는 규칙에 따라 다른 대기열로 메시지를 분배하여 동시성 수준을 높일 수 있습니다. 예를 들어 전자 상거래 주문 시나리오에서 동일한 사용자의 주문 메시지의 순서를 보장해야 하는 경우에만 동일한 사용자에 속하는 메시지를 다른 대기열로 보낼 수 있습니다.