流式计算模式初窥
这是我参与「第四届青训营 」笔记创作活动的第1天
由于大数据信息数量庞大、单位价值低但总体价值高的特性,采用流式计算能更好地实现对计算请求的实时响应,快速低延迟地完成请求处理。本篇文章记录了一个基于发布者订阅者模式的demo实现,是在观看大数据课程流/批/OLAP一体的Flink引擎介绍后对于基础流式计算模式的体验。
模拟一组响应事件完成的流式计算,Publisher发布者作为消息源产生事件形成stream,事件交给Subscriber订阅者进行处理。二者之间通过Subscription订阅进行连接,Subscriber通过Subscription的request方法告诉Subscriber对象能接收多少个事件;Subscriber通过Subscription的cancel方法取消订阅。同时可以增加若干个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();
}
}
运行结果:
一旦Subscriber与Publisher连接在一起即完成订阅,就会调用subscription的request(1)方法,即完成一个数据的处理【流量大小可控且由订阅方控制】,处理完成后会在onNext()方法的最后再获取一个数据进行处理,达成流式计算处理的效果。