Spring Cloud 분포 식 트 랜 잭 션 솔 루 션 의 메시지 최종 일치 성 방안

대강
참고:https://segmentfault.com/l/1500000012729662?r=bPzwfV
       https://segmentfault.com/a/1190000011479826#articleHeader2
마이크로 서비스의 유행 은 SLA 의 큰 향상 을 가 져 왔 지만 이에 따라 서비스 논리의 복잡성 을 가 져 왔 다. 분포 식 사물 은 마이크로 서비스 이 고 분포 식 구 조 는 반드시 해결 해 야 할 어 려 운 문제 이 며 현재 통 일 된 해결 방안 이 없다.
아 리 의 라 는 글 은 분포 식 시스템 (SOA, 마이크로 서비스) 에서 분포 식 사무 일치 성 은 피 할 수 없 는 도전 이다.간단 해 보 이 는 기능 은 내부 에서 여러 개의 '서비스' 를 호출 하고 여러 개의 데이터 베 이 스 를 조작 하거나 필름 을 나 누 어 실현 해 야 할 수도 있다. 서비스 제공 자 는 서로 다른 노드 용기 에 속 하고 여러 시스템 과 관련 되면 높 은 병행 결 과 는 예측 할 수 없다. 네트워크 디 더 링 은 어떻게 합 니까?서버 가 갑자기 끊 겼 는데 어 떡 하지?2 단계 실 패 했 습 니 다. 1 단계 스크롤 백 할 까요?만약 에 스크롤 백 에 실패 하면 요?이상 모니터링 은 어떻게 해 야 합 니까?본 강 좌 는 분포 식 업무 의 일반적인 해결 방안 인 2PC (2 단계 제출), 알 리 로켓 MQ 솔 루 션, 그리고 RabbitMQ 를 사용 하여 메시지 의 최종 일치 성 을 실현 하 는 방안 을 소개 하 며 프로젝트 소스 코드 에 대한 설명 을 포함한다.본 강 좌 는 다음 과 같다.
1.1 준비 와 학습
  • 분포 식 사무 가 무엇 입 니까
  • 현재 의 해결 방안
  • 메시지 큐 기반 솔 루 션
  • 1.2 실전
    RabbitMQ 메시지 의 최종 일치 성 솔 루 션 (CoolMQ) 원리 및 응용
    1.3 질의 응답
    여러분 의 질문 에 대답 하 다
    참고
    RabbitMQ 기초 지식 읽 기http://rabbitmq.org.cn 기술 문서
    둘 째 는 분포 식 사무 입 니까?
    현지 사 무 는 틀림없이 모두 가 알 고 있 을 것 이다.그런데 분포 식 사 무 는 무엇 일 까요?예 를 들 어 타 오 바 오 에서 물건 을 사면 두 가지 동작 이 있 습 니 다. 하 나 는 재 고 를 공제 하 는 것 이 고 두 번 째 는 주문 상 태 를 업데이트 하 는 것 입 니 다.한편, 분포 식 시스템 에서 예 를 들 어 마이크로 서비스, 재고 와 주문 은 두 개의 서비스 이다. 그러면 첫 번 째 단계 에서 재 고 를 공제 하 는 데 성공 했다 고 가정 한 다음 에 두 번 째 단계 로 요청 을 보 낼 때 네트워크 요청 이 실 패 했 지만 첫 번 째 단 계 는 감지 할 수 없고 스크롤 백 을 하지 못 하면 업무 가 일치 하지 않 을 것 이다.
    현재 의 해결 방안
    현재 해결 방안 에서 가장 흔히 볼 수 있 는 것 은 XA, 2PC, 3PC 등 이 있 는데 예 를 들 어 2 단계 제출 (2PC) 이다.
    하나의 업무 가 여러 노드 를 뛰 어 넘 을 때 업무 의 ACID 특성 을 유지 하기 위해 서 는 모든 노드 (참여 자 라 고 함) 의 작업 결 과 를 통일 적 으로 통제 하고 이 노드 들 이 작업 결 과 를 실제 제출 할 지 여 부 를 최종 적 으로 지시 해 야 한다 (예 를 들 어 업 데 이 트 된 데 이 터 를 디스크 에 기록 하 는 등).따라서 2 단계 에서 제출 한 알고리즘 사고방식 은 참여 자가 조작의 성 패 를 조율 자 에 게 알 리 고 조율 자가 모든 참여 자의 피드백 정보 에 따라 각 참여 자가 조작 을 제출 할 지 중지 할 지 결정 하 는 것 으로 요약 할 수 있다.
    회 의 를 예 로 들 면 갑 을 병 정 네 사람 이 회 의 를 조직 하려 면 회의 시간 을 확정 해 야 한다. 갑 은 조율 자 이 고 을 병 정 은 참여 자 이다.투표 단계: (1) 갑 은 을 병 정 에 게 메 일 을 보 내 고 화요일 10 시 에 회의 할 시간 이 있 습 니까?(2) 갑 의 회복 에 시간 이 있다.(3) 을 은 시간 이 있 으 면 회신 한다.(4) 병 이 늦게 대답 하지 않 을 때 이 활동 에 대해 갑 을 병 은 모두 차단 상태 에 있 고 알고리즘 은 계속 진행 할 수 없다.(5) 병 은 시간 이 있 거나 없 거나 답장 한다.제출 단계: (1) 조율 자 갑 은 수집 한 결 과 를 을 병 정 에 게 피드백 한다 (언제 피드백 하고 피드백 결과 가 어떠한 지, 이 예 에서 병 과 의 시간 과 결정 에 달 려 있다).(2) 을 수령;(3) 병 받 기;(4) 정수 받 기;참여 자의 모든 자원 을 잠 가 야 할 뿐만 아니 라 코 디 네 이 터 자원 을 잠 가 야 해 비용 이 많이 든다.한 마디 로 2PC 는 효율 이 낮 고 분포 식 사 무 를 하기 어렵 다 는 것 이다.
    4. 메시지 큐 기반 솔 루 션
    RocketMQ
    현재 메시지 큐 를 기반 으로 한 솔 루 션 은 알 리 의 RocketMQ 로 '반 메시지' 를 제시 하고 있 으 며 구체 적 인 절 차 는 다음 과 같다.
    1 단계: 상위 응용 업무 수행 및 MQ 메시지 발송
  • 상류 응용 프로그램 에서 확인 대기 메 시 지 를 신뢰 할 수 있 는 메시지 시스템 으로 보 내기
  • 신뢰 할 수 있 는 메시지 시스템 은 확인 할 메 시 지 를 저장 하고 되 돌려 줍 니 다
  • 상류 응용 현지 업무 수행
  • 상류 응용 알림 신뢰 할 수 있 는 메시지 시스템 확인 업무 가 실행 되 었 고 메 시 지 를 보 냅 니 다.
  • 신뢰 할 수 있 는 메시지 시스템 이 메시지 상 태 를 전송 상태 로 수정 하고 메 시 지 를 MQ 미들웨어
  • 에 전달 합 니 다.
    2 단계: 하위 응용 프로그램 은 MQ 정 보 를 감청 하고 업 무 를 수행 하 며 하위 응용 프로그램 은 MQ 정 보 를 감청 하고 업 무 를 수행 하 며 메시지 의 소비 결 과 를 신뢰 할 수 있 는 정보 서비스 에 알 립 니 다.
    신뢰 할 수 있 는 메시지 의 상 태 는 하류 응용 업무 수행 과 일치 해 야 한다. 신뢰 할 수 있 는 메시지 상 태 는 이미 완성 되 었 을 때 하류 응용 이 실행 되 지 않도록 확보 하고 신뢰 할 수 있 는 메시지 상 태 는 이미 완성 되 었 을 때 하류 응용 이 이미 실행 되 었 음 을 확보한다.
    하류 응용 과 신뢰 할 수 있 는 정보 서비스 간 의 상호작용 도 는 다음 과 같다.
  • 하류 에서 MQ 메시지 구성 요 소 를 감청 하고 정 보 를 가 져 옵 니 다
  • 하류 응용 은 MQ 메시지 체 정보 에 따라 현지 업 무 를 처리한다
  • 하위 애플 리 케 이 션 이 MQ 구성 요소 에 자동 으로 ACK 확인 메 시 지 를 보 내 소비 되 었 음
  • 하류 응용 알림 신뢰 할 수 있 는 메시지 시스템 정보 가 성공 적 으로 소비 되 었 고 신뢰 할 수 있 는 정 보 는 이 메시지 상 태 를 완성
  • 으로 변경 했다.
    이것 은 아 리 의 실현 방안 입 니 다. 관심 이 있다 면 알 아 보 세 요.
    RabbitMQ 실현
    우 리 는 rabbitmq 에서 몸 으로 믿 을 만 한 소식 을 실전 하 였 는데, rabbitmq 의 발송 과정 은 다음 과 같다.
  • 생산자 가 메시지 서비스 에 메 시 지 를 보낸다
  • 메시지 가 도착 하면 메시지 발단 에 표 지 를 되 돌려 줍 니 다.
  • 메시지 큐 에서 소비자 에 게 메 시 지 를 보 냅 니 다
  • 소식 감청 은 소식 을 받 아들 이 고 처리 에 성공 하면 수 동 으로 확인한다.
  • 이상 하 게 보 낼 수 있 는 네 가 지 를 살 펴 보 겠 습 니 다.
    1. 메시지 서비스 에 직접 도착 할 수 없습니다.
    네트워크 가 끊 기 면 이상 을 던 지고 업 무 를 바로 스크롤 백 하면 됩 니 다. connection closed 오류 가 발생 하면 connection 수 를 직접 증가 하면 됩 니 다.
    connectionFactory.setChannelCacheSize(100);
    2. 서버 에 도 착 했 지만 돌아 올 때 이상 이 발생 했 습 니 다.
    rabbitmq 는 ack 체 제 를 제공 합 니 다. 메시지 가 되 돌 아 왔 는 지 확인 할 수 있 습 니 다. 따라서 보 내기 전에 db (메모리 또는 관계 형 데이터베이스) 에 메 시 지 를 저장 하고 ack 이상 이 있 으 면 다시 보 낼 수 있 습 니 다.
    /**confirmcallback               */     
    rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
        if (!ack) {
            //try to resend msg
        } else {
            //delete msg in db
        }
    });
     /**         Exchange    returncallback */
    rabbitTemplate.setReturnCallback((message, replyCode, replyText, tmpExchange, tmpRoutingKey) -> {
        try {
            Thread.sleep(Constants.ONE_SECOND);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        log.info("send message failed: " + replyCode + " " + replyText);
        rabbitTemplate.send(message);
    });

    메시지 가 exchange 에 도착 하지 않 으 면 confirm 리 셋, ack = false 메시지 가 exchange 에 도착 하면 confirm 리 셋, ack = true 이지 만 exchange 를 찾 지 못 하면 returncallback 을 먼저 터치 합 니 다.
    3 소식 이 전 달 된 후, 소식 서 비 스 는 스스로 끊 었 다.
    메시지 의 지속 성 을 설정 하면 ack = true 는 메시지 의 지속 성 이 완 료 된 후에 하 드 디스크 에 저장 한 후에 보 내 는 것 입 니 다. 메시지 가 하 드 디스크 에 존재 하 는 지 확인 합 니 다. 만약 에 메시지 서비스 가 끊 기 면 메시지 서비스 회복 은 다시 메 시 지 를 보 낼 수 있 습 니 다.
    4 미 송 소비자
    메시지 서비스 가 메 시 지 를 받 으 면 클 라 이언 트 가 메 시 지 를 확인 할 때 까지 'UNACK' 상태 가 됩 니 다.
    channel.basicQos(1); // accept only one unack-ed message at a time (see below)
    final Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        String message = new String(body, "UTF-8");
    
        System.out.println(" [x] Received '" + message + "'");
        try {
          doWork(message);
        } finally {
           //      
          channel.basicAck(envelope.getDeliveryTag(), false);
        }
      }
    };
    boolean autoAck = false;
    channel.basicConsume(TASK_QUEUE_NAME, autoAck, consumer);

    5 소식 분실 확인
    메시지 가 돌 아 왔 을 때 메 시 지 를 잃 어 버 렸 다 고 가정 하면 메시지 서 비 스 는 메 시 지 를 다시 보 냅 니 다. autoAck = false 를 설정 하 였 으 나 channel. baskAck 에 응답 하지 않 았 고 channel. baskNack 에 응답 하지 않 았 다 면 심각 한 오류 가 발생 할 수 있 습 니 다. 메시지 대기 열 이 막 힐 수 있 으 므 로 어떻게 든 응답 해 야 합 니 다.
    6 소비자 업무 처리 이상
    메시지 감청 은 정 보 를 받 아들 이 고 처리 합 니 다. 만약 에 이상 을 버 렸 다 고 가정 하면 첫 번 째 단계 의 사물 이 완성 되 었 습 니 다. 스크롤 백 을 설정 하려 면 너무 번 거 롭 고 사무 보상 을 하 더 라 도 업무 보상 이 효력 을 잃 을 수 있 습 니 다. 그래서 여 기 는 중복 집행 을 할 수 있 습 니 다.인 육 이 바닥 을 파헤치다.
    다음으로 전송:https://blog.51cto.com/4925054/2115667

    좋은 웹페이지 즐겨찾기