游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Java9特性响应式流(ReactiveStream)

  什么是流
  形象的比喻来说就是如同水一样绵绵不绝的数据形式。而抽象点来说,是有一个生产者(source)产生,由一个或者多个消费者(sink)消费的数据元素(item)序列。那从这个抽象的描述就可以看出,使用流来承担数据交互的模式就是咱们经常说的生产者消费者模型,而这种模型也可以称之为发布者订阅者模型(后文将使用这个名字,因为JDK中使用的是这个名字)。
  对于流数据来说,一般有两种的数据流转方式:拉(pull)数据模式:订阅者向发布者索要数据。推(push)数据模式:发布者向订阅者推送数据(push)。
  这两种模式都是描述的单次信息传递的方式。如果发布者产生信息的速度和订阅者消费信息的速度一致的话,那这两种方法都将是十分有效的数据流转方式。流有什么问题
  流的问题在于当两端的速度不匹配的时候(考虑一下各种mq主要处理的问题削峰平谷)。而速度的不匹配自然存在以下两种情况:
  订阅者消费速度快
  这种情况的时候会出现订阅者有处理能力了,但是订阅者无信息可以处理的情况。如果这种时候是同步的调用模式,则订阅者将会阻塞,直到有新的信息可以进行处理。而如果这时候是异步的信息处理模式,则订阅者可以在无消息处理的时候挂起,直接切换到其他的任务处理中(对于多核CPU的多线程来说)。也就是说,对于这种情况,比较理想的是异步推模式。
  发布者发布速度快
  当发布者发布速度快的时候,会发生订阅者来不及处理数据的情况。如果是同步的情况下发布者会一直阻塞,而如果是异步模式则对于订阅者来说有两种处理方式(可以类比一下线程池设计)可以处理:损失数据:丢弃数据(在有限的队列缓存已经满了的情况下)不损失数据:加入队列缓存数据(订阅者需要有拥有无限的缓冲队列暂存数据,以确保不会溢出)
  而还有另一种需要发布者加入的处理方式叫做背压(backpressure)。背压的实现方式是:由订阅者发出信号,让发布者降低信息的发布速度,从而让信息速度之间匹配。背压的优点是同样可以处理信息流速不一致问题。而更有意思的是,这时候信息的处理策略可以由发布者来选择:损失数据:丢弃数据(在有限的队列缓存已经满了的情况下)不损失数据:加入队列缓存数据(发布者需要有拥有无限的缓冲队列暂存数据,以确保不会溢出)
  没错,这两种情况是和订阅者一致的,不过选择权则由订阅者变成了发布者。
  也就是说,在发布者发布速度快的时候,要么发布者直接同步阻塞,要么可以先根据消息的主要关心方(是发布者还是订阅者)来确定是否使用背压,然后再根据数据的类型判断是否接受数据丢弃(不丢弃可能会导致系统崩溃)。往往我们的发布者可以由上层的mq或者程序的应答机制保护消息的可用性。
  那么结论是什么,我们需要异步非阻塞(订阅者消费快)、以及背压(发布者发布快)。什么是响应式流
  ReactiveStreams是一项非阻塞背压的异步流处理标准的倡议,当然,如果我这个翻译看的不清楚的话就还是看原文吧(http:www。reactivestreams。org)。
  ReactiveStreamsisaninitiativetoprovideastandardforasynchronousstreamprocessingwithnonblockingbackpressure。
  响应式流(ReactiveStreams)概念被提出是在2013年,旨在处理上一小节中由于流速问题而产生的几种问题:订阅者订阅者的阻塞、由订阅者(数据下游)来选择是依赖无限队列(数据不丢)或直接丢弃数据。
  而对于一项标准而言,它的目是自然是用更少的协议来描述交互。而响应式流的模型也是十分简单:订阅者异步的向发布者请求N个元素。发布者一步的向订阅者发送M(0MN)个元素。
  基于这个模型,响应式流可以做到pull模型和push模型流处理机制之间动态切换。当订阅者较慢时,发送者没有新数量的请求则发布者进入等待请求信息的状态,相当于pull模型;当订阅者更快时,相当于发布者没有新的信息,订阅者进入到等待消息发送的状态相当于push模型。Java中的响应式流
  对于响应式流,在2015年的时候确定了关于其JavaAPI,具体的详情也也可以参考上面的链接。其中定义了4个API,具体为:PublisherSubscriberSubscriptionProcessorT,R
  对他们的定义为:
  Publisher(发布者)
  是一个假定上游会产生无限数据的信息发布者。他们会向有发送请求的订阅者推送元素。
  Subscriber(订阅者)
  订阅者会从发布者那里领取令牌,然后根据令牌向发布者发送获取请求。同时当发布者部分准备好元素的时候,会通过令牌对订阅者进行调用,进行数据消费。
  Subscription(令牌)
  发布者和订阅者通过令牌来进行信息通信的约定。主要有:开始订阅、信息获取、信息推送、异常、结束、取消订阅。
  Processor(处理器)
  可以通过处理器连接发布者、订阅者以及其他处理器。Processor本身同时继承了Publisher与Subscriber接口,所以可以对元素进行处理转发。主要用于让数据从T转换为R。同时,由于Processor本身也可以接入Processor,所以Processor可以组成链来对数据进行处理。
  一次完整的调用流程大概可以描述为:订阅者向发布者发送订阅请求。发布者根据订阅请求生成令牌发送给订阅者。订阅者根据令牌向发布者发送请求N个数据。发送者根据订阅者的请求数量返回M(MN)个数据重复3,4数据发送完毕后由发布者发送给订阅者结束信号
  而JavaAPI中的接口如下所示,其中所有的方法都是void,因为所有的方法都是异步执行的。publicinterfacePublisherT{用于1。中订阅请求publicvoidsubscribe(Subscriberlt;?superTs);}publicinterfaceSubscriberT{用于2。中回调发送令牌publicvoidonSubscribe(Subscriptions);用于3。用于接受4中发送过来的数据publicvoidonNext(Tt);用于3,4,5接收中间异常了之后的调用publicvoidonError(Throwablet);用于6。中结束信号的回调publicvoidonComplete();}publicinterfaceSubscription{用于3。的发送请求N个数据publicvoidrequest(longn);用于3,4,5订阅者异步的向publicvoidcancel();}publicinterfaceProcessorT,RextendsSubscriberT,PublisherR{}JDK中的响应式流
  JavaAPI中的流程使用方式看起来比较简单,但API背后的具体实现由于是全异步交互以及涉及具体背压处理而很困难。而JDK9中为用户提供了Publisher接口的简单实现,让开发人员可以基于此来扩展出自己的实际需求。
  JDK9中的响应式流功能提供在java。util。concurrent包下,全响应式流的API接口被封装到Flow接口中,其中包括需要使用的接口以及静态方法,关于上一小节中接口方法的详细描述也可以参见该接口上的方法描述。其中的静态接口为:Flow。ProcessorT,RFlow。PublisherTFlow。SubscriberTFlow。Subscription
  除去上一小节说的4个接口外,Flow中还包含了一个默认方法defaultBufferSize(),用于返回默认的令牌中的缓冲区大小,而默认的值为DEFAULTBUFFERSIZE256。
  除去Flow外,其中还有一个刚刚说到的Publisher的简单实现类SubmissionPublisher。该接口在实现了publisher之外还实现了AutoCloseable接口,所以可以直接用try块来进行资源的管理。
  尽管JDK9中没有提供Subscriber的简单实现,但是在SubmissionPublisher中提供了一个consume(Consumerlt;?superTconsumer)方法,用于让开发人员可以直接消费消息发布者的所有元素。实际上是在内部实现了简单的Subscriber为ConsumerSubscriber,但是并不是public的,所以不能直接使用。简单的例子
  根据JDK9中提供的SubmissionPublisher咱们来写一个小例子。publicstaticvoidmain(String〔〕args){用于承接返回值的任务CompletableFutureVoidtask;trywithresource来控制资源try(SubmissionPublisherIntegerpublishernewSubmissionPublisher()){System。out。println(默认缓冲容量:publisher。getMaxBufferCapacity());传入打印方法来处理元素taskpublisher。consume(System。out::println);打印数字,调用发布者进行信息处理IntStream。range(1,6)。forEach(publisher::submit);}if(task!null){try{当所有订阅者处理完毕后调用task。get();}catch(InterruptedExceptionExecutionExceptione){e。printStackTrace();}}}
  在这个例子里面进行了以下几件事。声明一个CompletableFuture用于捕获后续的处理事件。开启资源用于进行流消息订阅设置流的订阅方法(订阅者)进行发布者的信息发送阻塞主方法等待处理完毕后结束
  其中pub。getMaxBufferCapacity()会打印默认的缓存空间256。在调用publisher。consume的时候,是奖传入的Consumer在内部封装成一个Subscribr的简单实现类,用于订阅信息的发送,实时上后续数据的订阅者就是在这步创建的。
  当publisher进行调用的时候,调用submit发送数据,publisher有两个方法用于发送数据,一个是submit,一个是offer。两个方法下面实际都是调用的doOffer方法,所以,offer方法提供了置顶延迟时间后丢弃的策略,而submit是offer的简单实现,是一致阻塞不丢弃。最后
  不得不说响应式流是java中响应式编程的基础,而JDK9中也提供了ReactiveStreams的简单实现。之所示简单是打引号的是因为实际上还有点绕的,有兴趣的同学可以追一下SubmissionPublisher的实现,有一些思想的经典实现,比如用整数中的7位来作为状态机。在下一篇中我们再聊一下JDK9中的数据交互顺序。

七夕情人节送礼指南!高颜值蓝牙耳机推荐马上就到中国的传统节日七夕情人节了呢,不知道大家的礼物准备得怎么样了呢,如果还没准备好就要捉紧时间了哦,快收下这份安利,超高颜值的送礼款式蓝牙耳机!一、NANK南卡N2S……你的小米MIUI主题是什么?分享一下吧?感谢您的阅读MIUI主题有什么可以推荐的?这个要看您的喜好了,比如我喜欢简约接下来我推荐两款简约范的主题:BlurWhite个人在使用Blur,我很喜欢……都挺好没看过瘾?推手贾乃亮演绎男版苏明玉星关系3月25日讯今天,浙江卫视都市职场励志情感大剧《推手》发布了终极预告,将于明天登陆中国蓝剧场。该剧由贾乃亮、王鸥、刘欢、边潇潇、王劲松、李天柱等主演。《推手》是浙江卫视继……王鸥贾乃亮联手,接档姚晨都挺好,新剧推手袭来!星关系3月18日讯今日,浙江卫视都市武侠剧《推手》宣布定档并发布了定档海报,将于3月26日登陆中国蓝剧场。该剧由贾乃亮、王鸥、刘欢、边潇潇、王劲松、李天柱等主演。《推手》讲述了……后微服务时代,领域驱动设计在携程国际火车票的实践一、前言领域驱动设计(DomainDrivenDesign,简称DDD)是一种软件开发设计思想,其旨在以领域为核心,让软件系统在实现时准确地基于对真实业务过程的建模,专注……Redmi10强势曝光,5000mAh大电池,售价千元以内本月,小米MIX4、荣耀Magic3、iQOO8等重磅机型扎堆发布,新技术层出不穷,看得人眼花缭乱,堪称新一轮的神仙打架。而就在整个数码圈的目光都被上述几款新品吸引之时,国外爆……赖猫的狮子倒影杀青双面朱亚文杨子姗燃甜官宣星关系2月12日讯由爱奇艺出品,新鼎明影视、中汇影视、阳光倾城联合出品,朱亚文、杨子姗、李媛、贺军翔等领衔主演的都市动作爱情燃甜剧《赖猫的狮子倒影》近日正式杀青,隐与现主题官方……景甜杨子姗吕佳容曹曦文隔空比演技的时候到了星关系11月12日讯截至目前,除了《延禧攻略》、《如懿传》等热门爆款电视剧之外,再没出现新的爆款剧,而11月的荧幕新剧将扎堆上线,总有一款是你的最爱,景甜的《火王之千里同风》、……新剧不能停袁泉杨子姗吕佳容柳岩青衣霸屏星关系11月6日讯告别了回忆满满的十月,转眼间已经步入充满期待的十一月,又将有新的一批影视作品上线了,娱乐圈各大爱豆们即将带着自己最新的作品呈现给观众,袁泉、杨子姗、吕佳容、柳……电视剧穿盔甲的少女开播陈瑶甜蜜开嗓片尾曲恋爱必修课星关系8月24日讯电视剧《穿盔甲的少女》是由爱奇艺、江苏稻草熊影业有限公司、ABB良品制造出品,于中中执导,官鸿、陈瑶领衔主演,李九霖、敖子逸、马泽涵、戴蕥琪主演的青春校园练爱……陈瑶新戏少女大人开机天赋型探案能手苏瓷高甜来袭星关系5月20日讯5月19日,原创甜宠网剧《少女大人》在横店开机,刚结束《无心法师3》拍摄的陈瑶,现身新剧开机现场,据悉,《少女大人》是由企鹅影视、汉鼎宇佑传媒集团联合出品的,……亲爱的,热爱的首发无名之辈MV杨紫李现共踏超燃逐梦路星关系7月9日讯由华策克顿旗下剧酷传播出品,杨紫、李现主演的暖心爱恋剧《亲爱的,热爱的》发布《无名之辈》MV和个中高手海报,该剧改编自墨宝非宝小说《蜜汁炖鱿鱼》,展现佟年(杨紫……
网约车品牌域名,有哪些偏好?【新网域名资讯】域名作为企业重要的数字资产,不仅是承担网络品牌形象的作用,更是作为企业的独立站,不需下载安装,方便用户访问、收获真正的私域流量。有数据显示,到2020年中……事与愿违?iPhone13通话信号又翻车,阳谋与真相苹果第一代iPhone12发布之时,华为就曾嘲笑其使用的是第一代5G技术,而自己已经是第三代,当然iPhone12系列也的确在信号上的问题没能彻底解决。但不可否认,没有想国行版……徕卡135相机的鼻祖由奥斯卡巴纳克在100多年前发明的135相机,为摄影师开辟了全新的视角。这是第一次革命,与徕卡一起永远改变摄影。作为135相机的鼻祖,徕卡背后的故事,才真正展现着属于它的……蓝衣军团勇夺欧洲杯冠军国际高端家电gorenje与您共享意大北京时间7月12日晚,历经120分钟客场鏖战,蓝衣军团意大利最终点球决胜,夺得欧洲杯冠军。欢呼声响彻亚平宁半岛,意大利之夜回荡在欧洲的大街小巷。欧洲杯官方合作伙伴gorenje……这两款吉利SUV不仅在国内热销,海外市场同样受欢迎,真的不简如今国产车的进步虽大,但当下存在的问题是难以高端化和走出国门,不过随着领克、星瑞、红旗等品牌或者车型的热销,让我们看到了国产车高端化在渐渐崛起,那么走出国门进行到了哪一步呢?说……鸿蒙发布会,就在今晚!2000线上发布会见HiCar小知识,有趣有用!今天小仙女来分享:车载智慧屏如何快捷导照片〔比心〕小仙女了解到一些鸿蒙的点小仙女给大家提前解锁一点点吧〔爱慕〕1。当前鸿蒙操作系统和EM……年在一起新春年品礼盒,过一个不一样的中国年前言如果说在中国一年之中最隆重的节日是什么节日?那非中国的春节莫属。春节又叫过年是我国的传统节日,相传年是一种为人们带来坏运气的动物,年一来树木凋谢百草不生,年一过,万物……辛巴薇娅被指卖假货,二驴最狠一个月狂卖4。7亿山寨手机随着直播平台的兴起,现在越来越多的网红开始利用直播带货来收割自己的粉丝了。而随着直播带货的风行,各种大明星和大网红纷纷直播卖货,可以说赚得钵满盆满,一些大网红一场直播几个小时下……大数据编程入门Java方法在Java程序中我们经常会看到System。out。println(),其中println()是方法;System是系统类;out是标准输出对象。这条语句的用法是调用系统类Sy……大数据编程入门Java数组数组是各种编程语言的重要数据结构之一。当然,不同的语言对数组有不同的实现和处理,那么Java里的数组是如何处理的呢?今天小编将为大家带来大数据编程入门:Java数组。一、声明数……空调常用知识常用知识:1)压缩机的判断:压缩机的故障常有哪些?答:电阻最大的两点对应是C点,用C点分别测另两点,阻值大S、小M。电机烧坏、匝间短路、压缩机卡缸、抱轴、阀片损坏排气量下降。2……发布几年的iPhone6s备受好评,iPhoneSE也不错现如今已经步入了春季,手机市场上又有了新的操作,redmiK40系列不再沉默,它为5G手机市场带来了全新的血液,并且又有更多的骁龙870、骁龙888手机将与大家见面。很多用户看……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网