서비스 비동기 통신 - 직접

이미지 설명을 추가해주세요
개인 명함:

블로거: 술고래ᝰ.
개인 프로필: 와인을 즐기고, 와인의 에너지를 활용하여 미래를 위해 싸우세요.
이 글은 감동적입니다: 셋이서 여행을 가면 우리가 선생님이 되어줘야 해요.

이미지 설명을 추가해주세요
이 프로젝트는 스테이션 B 의 다크호스 프로그래머가 작성한 Java "SpringCloud 마이크로서비스 기술 스택" , SpringCloud+RabbitMQ+Docker+Redis+search+distributed를 기반으로 합니다.

[SpringCloud+RabbitMQ+Docker+Redis+검색+분산, 상세 시스템 설명 springcloud 마이크로서비스 기술 스택 강좌 | 다크호스 프로그래머 Java 마이크로서비스] 클릭해서 시청하세요

3. 스프링AMQP

4. 모델 다이렉트 게시 및 구독

RabbitMQ는 분산 시스템에서 데이터 교환 및 메시지 처리를 구현하는 데 사용되는 효율적이고 안정적이며 유연한 메시지 대기열 미들웨어입니다. RabbitMQ에서 Direct 모드는 일반적인 메시지 라우팅 모드로, 메시지의 지점 간 전달을 구현하고 각 메시지가 단 한 명의 소비자에 의해서만 수신되고 처리되도록 보장합니다.

1. RabbitMQ Direct 모드 개요
RabbitMQ의 Direct 모드는 메시지가 일대일 원칙에 따라 라우팅되는 것을 의미하며, 각 메시지에는 하나의 대상 큐만 있고, 하나의 소비자만 메시지를 받을 수 있습니다. 직접 모드에서 생산자는 특정 대기열에 메시지를 보내고 RabbitMQ는 필요에 따라 메시지를 하나 이상의 소비자에게 라우팅합니다. 이 모드는 각 메시지를 질서 있고 안정적으로 처리해야 하는 시나리오에 적합합니다.

2. RabbitMQ Direct 모드의 작동 원리

  • 메시지 라우팅

직접 모드에서 RabbitMQ는 메시지 속성에 따라 메시지를 특정 대기열로 라우팅합니다. 소비자는 이 대기열을 구독하여 메시지를 받고 처리합니다. 소비자가 메시지를 성공적으로 처리하면 RabbitMQ는 다른 소비자가 메시지를 받을 수 없도록 대기열에서 메시지를 삭제합니다.

  • 메시지 지속성

RabbitMQ의 직접 모드는 메시지의 영구 저장을 지원합니다. 즉, 시스템 충돌 시 데이터 손실을 방지하기 위해 메시지를 디스크에 저장할 수 있습니다. 또한 다이렉트 모드는 읽기 효율성을 높이기 위해 메시지의 메모리 캐싱도 지원합니다.

3. RabbitMQ Direct 모드의 장점

(1) 일대일 메시지 전달: 직접 모드는 일대일 메시지 전달을 구현하여 여러 소비자 간의 경쟁과 반복 처리를 피합니다.
(2) 높은 신뢰성: 각 메시지에는 단 한 명의 대상 소비자만 있으므로 각 메시지가 단 한 명의 소비자에 의해서만 올바르게 처리되도록 보장할 수 있어 시스템의 신뢰성이 향상됩니다.
(3) 순차성: 직접 모드는 메시지가 전송된 순서대로 소비자에 의해 하나씩 수신되고 처리되도록 보장하며 순서적인 처리가 필요한 상황에 적합합니다.
(4) 영구 저장: 직접 모드는 메시지의 영구 저장을 지원하여 시스템의 신뢰성과 안정성을 향상시킵니다.

4. RabbitMQ Direct 모드의 단점

(1) 로드 밸런싱: 각 메시지는 하나의 소비자만 수신하고 처리하므로 메시지의 로드 밸런싱을 달성할 수 없으며 이로 인해 시스템 처리량이 제한됩니다.
(2) 소비자 수 제한: 각 큐는 하나의 소비자만 메시지를 수신할 수 있도록 허용하므로 동시에 처리할 수 있는 소비자 수는 제한됩니다.

5. RabbitMQ 직접 모드 애플리케이션 시나리오

  • 작업 대기열: 작업 대기열 시나리오에서 생산자는 특정 대기열에 작업을 게시한 다음 여러 소비자가 대기열의 작업을 병렬로 처리합니다. 각 작업은 단 하나의 소비자에 의해 처리되므로 작업의 신뢰성과 무결성이 보장됩니다.
  • 지점 간 통신: 지점 간 통신 시나리오에서 RabbitMQ의 직접 모드는 안정적인 메시지 전달과 질서 있는 메시지 처리를 달성할 수 있습니다. 예를 들어, 채팅 애플리케이션에서 직접 모드를 사용하면 각 메시지를 한 명의 사용자만 수신할 수 있으므로 메시지 중복 및 경쟁을 피할 수 있습니다.
  • 트랜잭션 처리: 트랜잭션 처리 시나리오에서는 각 트랜잭션의 원자성과 일관성을 보장해야 합니다. 직접 모드는 일대일 메시지 전달을 실현하고 각 트랜잭션이 하나의 노드에서만 처리되도록 보장하여 트랜잭션 처리의 일관성과 신뢰성을 향상시킵니다.
  • 주문 처리: 주문 처리 시나리오에서는 각 주문을 개별적으로 처리해야 하며 처리 순서와 신뢰성이 보장되어야 합니다. 직접 모드는 주문 메시지의 일대일 전달을 실현하여 각 주문이 하나의 프로세서에서만 올바르게 처리되도록 보장합니다.

요약하다

RabbitMQ의 직접 모드는 간단하고 안정적인 메시지 라우팅 모드로, 각 메시지를 질서 있고 안정적으로 처리해야 하는 시나리오에 적합합니다. 일대일 메시지 전달을 구현하고 각 메시지가 단 한 명의 소비자에 의해서만 올바르게 처리되도록 보장합니다. 그러나 Direct 모드 역시 로드 밸런싱, 소비자 수 제한 등의 단점이 있습니다. 애플리케이션에서 선택과 최적화는 실제 요구 사항을 기반으로 해야 합니다.

게시 및 구독-DirectExchange

Direct Exchange는 수신된 메시지를 규칙에 따라 지정된 대기열로 라우팅하므로 이를 라우팅 모드(경로)라고 합니다.

각 대기열에는 Exchange에 설정된 BindingKey
게시자가 있습니다. 메시지를 보낼 때 메시지의 RoutingKey가 지정됩니다.
Exchange는 BindingKey가 메시지 RoutingKey와 일치하는 대기열로 메시지를 라우팅합니다.

사례: SpringAMQP를 사용하여 DirectExchange 사용 시연

구현 아이디어는 다음과 같습니다. @RabbitListener를 사용하여 소비자 서비스에서
Exchange, Queue 및 RoutingKey를 선언하고 direct.queue1 및 direct.queue2를 각각 수신하는 두 개의 소비자 메소드를 작성하고 게시자에서 테스트 메소드를 작성하고 메시지를 보냅니다. itcast.direct로


1단계: 소비자 서비스에서 Exchange 및 Queue 선언 소비자 서비스에서 direct.queue1 및 direct.queue2를 각각 수신하는 두 가지 소비자 메소드를 작성
하고 @RabbitListener를 사용하여 Exchange, Queue 및 RoutingKey를 선언합니다.

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue1"),
        exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
        key = {
    
    "red", "blue"}
))
public void listenDirectQueue1(String msg){
    
    
    System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
}

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue2"),
        exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
        key = {
    
    "red", "yello"}
))
public void listenDirectQueue2(String msg){
    
    
    System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
}

2단계: 게시자 서비스의 DirectExchange에 메시지 보내기
게시자 서비스의 SpringAmqpTest 클래스에 테스트 메서드를 추가합니다.

@Test
public void testDirectExchange() {
    
    
    String exchangeName = "itcast.direct";
    String message = "hello, direct";
    rabbitTemplate.convertAndSend(exchangeName, "yello", message);
}

여기에 이미지 설명을 삽입하세요.

요약하다:

  1. 직접 스위치와 팬아웃 스위치의 차이점을 설명해주세요.
    Fanout 스위치는 바인딩된 각 대기열로 메시지를 라우팅합니다.
    Direct 스위치는 RoutingKey를 기반으로 라우팅할 대기열을 결정합니다.
    여러 대기열이 동일한 RoutingKey를 갖는 경우 이 기능은 Fanout과 유사합니다.
  2. @RabbitListener 주석을 기반으로 대기열 및 스위치를 선언하기 위한 일반적인 주석은 무엇입니까?
    @큐
    @Exchange

Supongo que te gusta

Origin blog.csdn.net/m0_65144570/article/details/133106385
Recomendado
Clasificación