专栏首页性能与架构Java 9 新特性:Reactive Streams

Java 9 新特性:Reactive Streams

Reactive Streams

Reactive Streams 是一个使用非阻塞背压机制的异步流处理标准。

back pressure(背压)是其中的关键概念。在异步模式中,消费者订阅生产者,从生产者那里获取数据,需要提供回调方法,当生产者产生新的可用数据后,就调用回调方法。当生产者发送数据的速度大于消费者处理的速度时,消费者就会抢占更多的资源来处理,并且有崩溃的可能。为了防止这种问题,需要一种机制,能让消费者通知生产者:生产速度太快了需要减速,然后生产者可以进行相应调整。这个机制就叫做背压

背压可以分为阻塞非阻塞

阻塞比较简单,例如生产者和消费者运行在同一个线程中,一个执行、另一个阻塞,意味着当消费者执行时,生产者不会发送新的数据。

非阻塞的方式是把 推模式 改为了 拉模式推模式是生产者来决定,生产者尽快的把数据发给消费者,拉模式是消费者来决定,消费者向生产者请求一定数量的数据,生产者会按照这个数量发送,在下次请求到来之前就是等待。

API 中的重要类型

Publisher

生产数据,供订阅者消费,只有一个方法 subscribe(Subscriber)

Subscriber

订阅生产者,接收数据(通过 onNext(T) 方法)、错误信息( onError(Throwable) 方法)、没有更多数据的信号( onComplete() ),在这些动作之前,publisher 会调用 onSubscription(Subscription)

Subscription

是发布者和订阅者之间的连接,订阅者会通过它来请求更多的数据( request(long) ),或者中断连接( cancel() )。

整体流程

  • 创建一个 Publisher 和一个 Subscriber
  • 通过 Publisher::subscribe 关联订阅者
  • 发布者创建一个 Subscription 然后调用 Subscriber::onSubscription,这样订阅连接就建立起来了
  • 订阅者调用 Subscription::request 请求一定数量的数据
  • 发布者调用 Subscriber::onNext 向订阅者传递数据,数据量不会超过订阅者指定的数量
  • 当发布者没有更多数据时会调用 Subscriber::onComplete,如果出错就调用 Subscriber::onError
  • 订阅者可以继续请求更多的数据,或者通过 Subscription::cancel 关闭连接

可以看到,订阅者调用 Subscription::request 主动请求,这就是对非阻塞背压的实现。

本文分享自微信公众号 - 性能与架构(yogoup),作者:杜亦舒

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx 限制IP并发数

    前几天介绍了CC攻击及其防护方法,其中有一个方法是限制同一个IP的并发请求数量,以防止来自同一IP的大量高并发攻击 我的服务器一直没有配置这个限制,今天实验了一...

    dys
  • 你在使用什么 Redis 客户端工具?

    今天发现一个不错的 Redis 客户端工具:AnotherRedisDesktopManager。

    dys
  • MongoDB 多对多关系的简单示例

    例如文章的标签,一篇文章可能包含多个标签,一个标签也会对应多篇文章 这是一个多对多的映射关系,在sql中我们一般这样设计 Article: Id ...

    dys
  • 自己实现一个简单版的HashMap

    HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap 继承于AbstractMap,实现了Map、Cloneable、...

    一觉睡到小时候
  • Docker系列教程22-docker-compose.yml常用命令

    用户1516716
  • 看Jetson TX2如何提高农作物产量

    每年,农民都在尽力减少因病害造成的作物损失。仅在2016年,大约有8.17亿蒲式耳的玉米因病害而损失。尽早识别和治疗这些病害会给农民带来很大的帮助,但是专家走遍...

    GPUS Lady
  • 新时代网络工程师的出路

    随着云计算、大数据、物联网、人工智能等各领域迅速崛起,尤其是软件定义一切的理念渐渐植入新兴行业,大环境、新技术的冲击对于网络工程师而言是一个巨大的挑战。笔者之...

    ICT售前新说
  • Virtual Dom和Diff算法

    这是一篇很长的文章!!!坚持看到最后有彩蛋哦!!! 文章开篇,我们先思考一个问题,大家都说 virtual dom 这,virtual dom 那的,那么 vi...

    前端迷
  • 高质量编程的金玉良言——依赖倒转原则

    生活中的例子: 电脑的品牌有很多,但电脑中的所有部件都有标准的接口,不同的厂家都是按照标准去生产各个部件,这些部件的内部实现不同,但接口都是一样的,这样的话,如...

    大闲人柴毛毛
  • GitHub排名前20的Pandas, NumPy 和SciPy函数

    大数据文摘

扫码关注云+社区

领取腾讯云代金券