流式计算模式初窥| 青训营笔记

108 阅读2分钟

流式计算模式初窥

这是我参与「第四届青训营 」笔记创作活动的第1天

由于大数据信息数量庞大、单位价值低但总体价值高的特性,采用流式计算能更好地实现对计算请求的实时响应,快速低延迟地完成请求处理。本篇文章记录了一个基于发布者订阅者模式的demo实现,是在观看大数据课程流/批/OLAP一体的Flink引擎介绍后对于基础流式计算模式的体验。

image-20220727163722713.png

模拟一组响应事件完成的流式计算,Publisher发布者作为消息源产生事件形成stream,事件交给Subscriber订阅者进行处理。二者之间通过Subscription订阅进行连接,Subscriber通过Subscriptionrequest方法告诉Subscriber对象能接收多少个事件;Subscriber通过Subscriptioncancel方法取消订阅。同时可以增加若干个Processor接口进行请求的中间处理,即将一个事件转化成另一个事件。

public class PrintSubscriber implements Flow.Subscriber<Integer> {
    private Flow.Subscription subscription;
    @Override
    public void onSubscribe(Flow.Subscription subscription) { // 完成注册
        this.subscription = subscription;
        subscription.request(1);
    }
​
    @Override
    public void onNext(Integer item) { // 接收请求数据
        System.out.println("Have received item : " + item);
        subscription.request(1);
    }
​
    @Override
    public void onError(Throwable throwable) { // 发生错误
        System.out.println("Error occurred : " + throwable.getMessage());
    }
​
    @Override
    public void onComplete() { // 接收结束
        System.out.println("printSubscriber is complete!");
    }
}
​
////////////////////////////////////
public class SubmissionPublisher implements Flow.Publisher {
    private PrintSubscriber printSubscriber;
    @Override
    public void subscribe(PrintSubscriber printSubscriber) {
        this.printSubscriber = printSubscriber;
        printSubscriber.onSubscribe(new Flow.Subscription() {
            @Override
            public void request(long n) {
            }
​
            @Override
            public void cancel() {
            }
        });
    }
​
    @Override
    public void submit(Integer integer) {
        printSubscriber.onNext(integer);
    }
    public void complete() {
        printSubscriber.onComplete();
    }
}
////////////////////////////////////////
public class demo {
    public static void main(String[] args) throws InterruptedException {
        SubmissionPublisher publisher = new SubmissionPublisher();
        publisher.subscribe(new PrintSubscriber());
        System.out.println("submitting items ... ");
        for (int i = 0; i < 10; i++) {
            publisher.submit(i);
        }
        Thread.sleep(500);
        publisher.complete();
    }
}

运行结果:

image-20220727164306245.png

一旦SubscriberPublisher连接在一起即完成订阅,就会调用subscriptionrequest(1)方法,即完成一个数据的处理【流量大小可控且由订阅方控制】,处理完成后会在onNext()方法的最后再获取一个数据进行处理,达成流式计算处理的效果。