트래픽 우유 공장의 흐름에 반응성 (2) 반응

식의 반응을 이야기

이전의 기사 "할리우드"에 대한 반응성에서 프로그래밍 응답은 약간의 차이에 대해 이야기, 개념의 몇 가지 유형에 대해 이야기했다. 어떤 실제 전투를 포함하지 않았기하지만 여전히, 개념적 수준에 남아 있습니다.
나는 읽기, 혹은 일부 피상적 그래서 후.

반응성 프로그래밍 중점을 둘 출생 허공없는 줄, 처리 ​​스트림에 대한 비동기 기술이지만, 기술 연습의 많은 수에서 같은 그것의 개념을 요약 한 것입니다 :

  • 우리는 자바 비동기 IO (하면 동기식 IO)를 생각하기 쉬운하면 동기식를 이야기하고, 비교 및 ​​BIO, NIO 개념을하는 데 사용됩니다. 모두가 아시다시피, 스윙 프레임 워크는 오래 전에 매우 미끄러 재생 비동기 생각하고있다 (자바 UI) 출연, 당신은 내부 관찰자 모드의 구현을 볼 수 있다고 생각하지 않습니다 (관찰자)입니다.

  • 우리는 스트리밍에 대해 이야기하고, 요즘 FLINK 프레임 워크 인기를 생각하기 쉽습니다. 그러나 거의 모든 빅 데이터 분석은, 배치 애플리케이션도지도의 단순한 일자리 감소 등 ETL로, 기반 스트리밍을 처리됩니다.

왜 웹 백엔드 개발, 반응성의 아무 느낌이 없다

프런트 엔드 응용 프로그램뿐만 아니라 빅 데이터 분야에서의 반응성 개념은 실제로 매우 광범위하다. 하지만 백엔드 대부분의 웹 개발자는 아마도 외부 코드 계층화 일뿐만 아니라, 그 코드이 몇 년은 저자의 자신의 경험에 인기 높은 수준의 아닌 사람들은 플레이 반응성을 참조하지 않는 것 않습니다 중요한 역할을 놓습니다. 그 이유는, 그 백 엔드 웹 개발 분야는 기본적으로 매우 간단 달성하기 위해 HTTP 프로토콜 메커니즘에 의존에 요청 -> 응답 대화 형 모드, 클라이언트, 결과 통지의 결과 인 반환을 기다리는했을 요청을 전송 한 후 이니셔티브는 클라이언트가 아닌 비동기 통지, 따라서 반응성이없는 스타일에 인수된다. 그러나 이것은 우리가 깊은 인식과 반응하지 않는이 시간에, 필요하지 않은 대부분의 경우 어떤 변화가 사용자의 일관된 사용과 일치한다.

또 다른 시나리오가있다 반응성에 맞춰 더 리치 클라이언트 (리치 응용 프로그램) , 시나리오를 가정하는 대화 형 복합 프런트 엔드 많이 필요, 우리는 프론트 엔드 코드에서 구현 몇 가지 논리를 넣어 선택할 수 있습니다. 이 웹 상호 작용에서 전체 페이지를 새로 고침 더 이상이지만, "실시간"양방향 메시징 클라이언트와 서버로 전환,이 응용 프로그램은 그래서 그 기반 채팅 애플리케이션 웹 소켓 구현, 게임과 같은 일반적인 없습니다.

추세에서 판단 일반이, 반응성 전망은 여전히 불확실하다, 여기에 지금 가장 인기있는 프로그래밍 언어 (예 : 제공 RX-스타일의 프레임 워크 등)의 그림자를 가지고 있기 때문에 말을하지.
그러나 다음 큰 데이터 처리, 실시간 스트림 컴퓨팅 환경에 의해 결정되는 주류가 될 것이다. 반응성 그리고 다음이 "스트림 지향"프로그래밍 모드는 의심 할 여지없이 매우 적합합니다.

자바 9 지원 반응성 스트림

Java 플랫폼 JDK (9)는 반응성에 대한 완전한 지원을 제공하고, 이전에이에 JDK 버전뿐만 아니라,와 같은 일부 API는 관련이 없을 때까지 :

  • 비동기 연산을 구현하기위한 미래 CompletableFuture 인터페이스. 전자보다 후자가 비동기식 통지하고, 일련의 작업에 다른 특성의 결과를 개선하기위한 것이다.
  • 스트림 인터페이스는 "흐름"으로, 이러한 반복 매핑 변환되도록 종래의 세트로 변환 될 수있다.

전체 반응성이 협회는 API 아니라, 자바 (9)는 2013 년 반응 흐름 사양 (반응성 스트림 사양)에서 반응성 스트림 API를 지원했다.

https://www.reactive-streams.org/

이 사양을 바탕으로 다음과 같은 몇 가지 주요 인터페이스를 정의합니다 :

인터페이스에 정의 된 자바 응답 플로우 통합 인터페이스 java.util.concurrent.Flow

  • 게시자
    즉, 데이터의 발행. 게시자 인터페이스는 가입자를 추가하는 방법을 정의 구독 :

  • 가입자는
    가입자의 데이터를 의미한다. 가입자 인터페이스는 다른 이벤트에 응답하기위한 네 가지 방법을 정의합니다.

방법을 구독 호출이 성공 후 첫째, 가입자의 onSubscribe (구독들) 방법 (서브 스크립 션은 현재 가입 관계를 나타냄) 트리거됩니다.
그 후, 통상의 게시자에게 데이터를 요청하는 등록 요청 (길이, N) 메소드를 호출을 계속할 수, n은 데이터 엔트리의 최대 수이다.

게시자 세 가입자 콜백 메소드에 해당하는 세 가지 메시지를해야합니다 :

메시지 데이터 : onNext 방법에 대응 게시자을 나타내는 데이터가 생성.
오류 메시지의 OnError 방법은 발행자를 나타내는에 해당 오류를 일으켰다.
메시지의 끝 : 해당 onComplete를 방법은 게시자가 모든 데이터의 방출을 완료 나타냅니다.

위의 세 가지 응답에서, 오류 메시지가 어떤 메시지가 나중에 생성되지 않을 것이다 스트림의 현재의 단부는 그 단부에 도달 나타낸다.

  • 정액제
    가입이 가입 관계에 의해 표현된다. 데이터 (요구 method)을 요청할 수있는 물체 또는 (방법 취소)을 거부.

  • 프로세서
    특수 목적 프로세서 프로듀서뿐만 아니라, 가입자 모두를 대표했다.

부정적인 압력 지원

부압 상기 인터페이스에 정의 된 화학식 I의 흐름에 대응하는 중요한 능력이다 실질적 부압 지원이 제공되고있다.
발행인은 요청 접수 후, 데이터를 생성합니다. 이것은 자신의 능력에 따라 상기 가입자가, 출판사는 데이터의 양이 씻겨되지 자신을 보장하기 위해 요구되도록 결정되도록.

이제, 간단한 코드 예제를 사용하는 방법 반응성 스트림 API 설명합니다.

특정 식물 우유는, 예를 들어, 수익을 높이기 위해, 공장은 공장 직접 판매 사업을 시작했다. 고객이 직접 공장에 일의 유제품 특정 번호를 주문할 수 있습니다, 매일 공장 서비스 직원의 우유 배달부 문이다.
이 시나리오를 시뮬레이션하기 위해, 우리는 다음과 같이 코드가 인식 :

  1. 우유 공장, 실현 출판사 :
public class MilkFactory extends SubmissionPublisher<String> {

    private final ScheduledFuture<?> periodicTask;
    private final ScheduledExecutorService scheduler;

    private static final List<String> milks = Arrays.asList("益力多", "酸牛奶", "原味奶", "低脂蛋奶", "羊奶", "甜牛奶");

    public MilkFactory() {
        super();
        //初始化定时器
        scheduler = new ScheduledThreadPoolExecutor(1);

        //每一天生产完牛奶并推送给消费者
        periodicTask = scheduler.scheduleAtFixedRate(
                () -> submit(produceMilk()), 0, 1, TimeUnit.SECONDS);
    }

    //随机生产牛奶
    private String produceMilk() {
        return milks.get((int) (Math.random() * milks.size()));
    }

    //关闭流
    public void close() {
        periodicTask.cancel(false);
        scheduler.shutdown();
        super.close();
    }
}

MilkFactory 통합 자체 SubmissionPublisher은 (버퍼 실현 출판사를 제공), 내부는 매일 우유 생산 자료를 시뮬레이션하는 사용자에 대한 타이머를 시작합니다.
데이터는 제출 () 메소드를 통해 사용자에게 푸시 될 수있다.

  1. 고객은 가입자를 달성 :
public class MilkCustomer implements Flow.Subscriber<String> {
    private Flow.Subscription subscription;
    private AtomicInteger available = new AtomicInteger(0);
    private int dayCount;

    public MilkCustomer(int dayCount) {
         this.dayCount = dayCount;
    }
    @Override
    public void onSubscribe(Flow.Subscription subscription) {
        this.subscription = subscription;
        //设置总量
        available.set(dayCount);

        //第一天
        subscription.request(1);
    }

    @Override
    public void onNext(String milk) {
        System.out.println("今天的牛奶到了: " + milk);

        //如果还有存量,继续请求
        if(available.decrementAndGet() > 0){
            subscription.request(1);
        }else{
            System.out.println("牛奶套餐已经派完,欢迎继续订购");
            this.subscription.cancel();
        }
    }

    @Override
    public void onError(Throwable t) {
        t.printStackTrace();
    }

    @Override
    public void onComplete() {
        System.out.println("closed.");
    }
}

MilkCustomer이 상원에 DAYCOUNT을 받아,이 양이 주문한 것을 의미 할 때 우유의 첫 번째 날에 처음 가입 요청, 다음 우유가 수신 할 때마다 다음 - 투 - 하루 총 소비의 완료 될 때까지 요청 후.

  1. 테스트 절차

다음 코드를 실행합니다 :

MilkFactory factory = new MilkFactory();

//订阅1周
MilkCustomer customer = new MilkCustomer(7);

factory.subscribe(customer);

출력 :

今天的牛奶到了: 酸牛奶
今天的牛奶到了: 羊奶
今天的牛奶到了: 原味奶
牛奶套餐已经派完,欢迎继续订购

개요

위의 예에서 우리는 반응성 스트림 API 자바 구현이 "우유 장수 문"교통 흐름을 제공하는 사용합니다.
전체 프로세스는, 키 로컬 대류 과정을 이해하는 거짓말, 및 구독 관계가 비교적 간단하다. 그러나, 현재의 반응성 달성은 봄 WebFlux (SpringBoot 2 지원)는 여전히 다음을 할 수있는 기회를 다음에 구축하는 대신 반응성 스트림 API의 원자로 개인 API에 기반으로 완전히 통합되지 않았습니다.

추가 읽기

미래의 차이 CompletableFuture 소개
https://juejin.im/post/5adbf8226fb9a07aac240a67

추천

출처www.cnblogs.com/littleatp/p/11470304.html