flux

Reactor 3 (6): 背压 Backpressure 使用

拜拜、爱过 提交于 2020-08-07 09:50:27
有这样的情况,上游传递到下游的数据需要进行处理,然而上游推送的速度又很快,下游由于资源等原因来不及处理;如果这时还是通过不限制上游速度的方式推送数据,就会出问题,因此Reactive Streams有两一种处理方式,就是通过request的机制向上游传递信号,并指定接收数量;通过这种方法将 push 模型转化为 push-pull hybrid ,这就是backpressure的用法。 通过编写Subscriber实现backpressure 下面介绍backpressure比较原始的写法,通过构建Subscriber控制request的大小: @Test public void rawBackPressure ( ) { Flux < String > flux = Flux . range ( 1 , 10 ) . map ( i - > String . valueOf ( i ) ) . log ( ) ; flux . subscribe ( new Subscriber < String > ( ) { private int count = 0 ; private Subscription subscription ; private int requestCount = 2 ; @Override public void onSubscribe (

Spring5-Reactor函数式编程

喜你入骨 提交于 2020-08-06 09:05:28
content {:toc} 前言 反应式编程是一种可以替代命令式编程的编程范式。这种可替代性存在的原因在于反应式编程解决了命令式编程中的一些限制。理解这些限制,有助于你更好地理解反应式编程模型的优点 反应式流规范 对比 Java 中的流 Java的流和反应式流Java的流和反应式流之间有很多相似之处。首先,它们的名字中都有流(Stream)这个词。 它们还提供了用于处理数据的函数式API。事实上,正如你稍后将会在介绍Reactor时看到的那样,它们甚至可以共享许多相同的操作。 Java的流通常都是同步的,并且只能处理有限的数据集。从本质上来说,它们只是使用函数来对集合进行迭代的一种方式。 反应式流支持异步处理任意大小的数据集,同样也包括无限数据集。只要数据就绪,它们就能实时地处理数据,并且能够通过回压来避免压垮数据的消费者。 反应式流规范 反应式流规范可以总结为4个接口:Publisher、Subscriber、Subscription和Processor。 Publisher负责生成数据,并将数据发送给Subscription(每个Subscriber对应一个Subscription)。 Publisher接口声明了一个方法subscribe(),Subscriber可以通过该方法向Publisher发起订阅。 public interface Publisher<T> {

如何从JDK8 Stream转换为反应式框架流?

被刻印的时光 ゝ 提交于 2020-07-29 06:41:36
一、前言 最近在做一个项目,获取JDK8 Stream对象后,想要批量消费,不想自己写个集合来做批量处理。而反应式编程实现比如rxjava或者reactor是有丰富的流操作符,所以调研了下如何把JDK8 Stream转换为反应式流。 二、批量消费 有时候场景需要我们批量消费以便提高执行效率,比如对应同一个表的插入操作,批量插入的效率比单条逐个插入效率要好很多。那么对应给定的一个数据源,如何聚合数据为批量那?当数据源是一个内存list时候,最简单方法如下: public static void main(String[] ar) { //1.创建list List<Integer> personList = new ArrayList<Integer>(); for (int i = 0; i < 100; ++i) { personList.add(i); } //2.切分处理 List<List<Integer>> list = Lists.partition(personList, 20); list.stream().forEach(tempList->System.out.println(JSON.toJSONString(tempList))); } 如上代码1创建了一个list列表,代码2,使用Google guava包里面的Lists

ELK学习笔记之F5 DNS可视化让DNS运维更安全更高效-F5 ELK可视化方案系列(3)

為{幸葍}努か 提交于 2020-07-28 18:52:37
0x00 概述 此文力求比较详细的解释DNS可视化所能带来的场景意义,无论是运维、还是DNS安全。建议仔细看完下图之后的大篇文字段落,希望能引发您的一些思考。 在“F 5利用Elastic stack(ELK)进行应用数据挖掘系列(2)-DNS ”一文中阐述了通过DNS logging profile进行DNS可视化的一种方法。DNS logging profile本身对解析和响应是发出的两条日志,因此在上篇文章中我们其实用了一些特殊的方法来处理一些我们想要的场景。所以这样的处理方式可能不够灵活,也不够优雅。通过logstash根据Query ID进行日志聚合后再处理也是一种思路,但是日志聚合本身这个动作需要仔细处理以防止聚合出错。同时即便使用了聚合,由于DNS logging profile输出的内容是固定的,因此在灵活性上依旧差那么一些。这篇文章则给大家提供了另一外一种形式的可视化。从通用性角度来说,更建议使用本篇文章中的方法,不受BIGIP DNS(GTM)版本及模块license类型的影响。 0x01 方法思路 iRule通过HSL输出必要的解析日志数据至elk 0x02 Dashboard与可视图分析 在整个dashboard中,划分了这样几个功能区域: 最上面的解析来源地理热力图,可以清晰的看出哪些地方是热点解析区域。热点解析区域,结合DNS TTL参考

前端架构 101(六):整洁(Clean Architecture)架构是归宿

笑着哭i 提交于 2020-07-28 10:32:43
李熠:前端架构 101(一):在谈论它们之前我们需要达成的共识 ​ zhuanlan.zhihu.com 李熠:前端架构 101(二): MVC 初探 ​ zhuanlan.zhihu.com 李熠:前端架构 101(三):MVC 启示录:模块的职责,作用域和通信 ​ zhuanlan.zhihu.com 李熠:前端架构 101(四):MVC 的不足与 Flux 的崛起 ​ zhuanlan.zhihu.com 李熠:前端架构 101(五):从 Flux 进化到 Model-View-Presenter ​ zhuanlan.zhihu.com 整洁架构 如果你对整洁架构(Clean Architecture)有所了解的话,回想一下我们前几篇中描述的内容,你会发现整洁架构对前端,对 MVP 来说也是同样适用的。 关于什么是整洁架构完全可以通过阅读 Uncle Bob 原版图书中文版《整洁架构之道》来了解,或者可以通过阅读他的一个简短版本博客 The Clean Architecture 一探端倪。但我还是推荐阅读图书,图书全面而且浅显易懂,没有和某一门编程语言强行绑定,即使你没有后端背景也能流畅的通读下来。出于篇幅的考虑,在这里我只取一瓢,摘取一个契合于我们前端架构的知识点以做说明,就是 模块间的依赖关系 这篇文章里更多的是告诉你 what(结论),而不是 why(为什么需要这么做

前端三大主流框架React、Vue、Angular的对比

痞子三分冷 提交于 2020-07-26 23:39:42
前言 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式。 一、Angular,它两个版本都是强主张的,如果你用它,必须接受以下东西: 必须使用它的模块机制 必须使用它的依赖注入 必须使用它的特殊形式定义组件(这一点每个视图框架都有,难以避免) 所以Angular是带有比较强的排它性的,如果你的应用不是从头开始,而是要不断考虑是否跟其他东西集成,这些主张会带来一些困扰。 二、React 它也有一定程度的主张,它的主张主要是函数式编程的理念,比如说,你需要知道什么是副作用,什么是纯函数,如何隔离副作用。它的侵入性看似没有Angular那么强,主要因为它是软性侵入。你当然可以只用React的视图层,但几乎没有人这么用,为什么呢,因为你用了它,就会觉得其他东西都很别扭,于是你要引入Flux,Redux,Mobx之中的一个,于是你除了Redux,还要看saga,于是你要纠结业务开发过程中每个东西有没有副作用,纯不纯,甚至你连这个都可能不能忍: const getData = () => { // 如果不存在,就在缓存中创建一个并返回 // 如果存在,就从缓存中拿 } 因为你要纠结它有外部依赖,同样是不加参数调用,连续两次的结果是不一样的,于是不纯。为什么我一直不认同在中后台项目中使用React

pi flux计算程序

£可爱£侵袭症+ 提交于 2020-07-26 23:39:01
主计算程序 Nx=18; % Ny=4; % 体系宽度(y方向的长度) [x,y]=zigzag_graphene(Nx,Ny); n = 4*Nx*Ny; t1=-2.7; H=Hamiltonian_NN_graphene(x,y,t1); H=Hamiltonian_NN_phase(Nx,4*Ny,H,t1); H=Hamiltonian_defect(x,y,4*Ny,H,t1); miu = sqrt(3)*t1; H = H- miu*eye(n,n); HD=H(n/3+1:2/3*n,n/3+1:2/3*n); HDL=H(n/3+1:2/3*n,1:n/3); HDR=H(n/3+1:2/3*n,2*n/3+1:n); x=x(n/3+1:2/3*n,1); y=y(n/3+1:2/3*n,1); m=length(HD); % 体系总的原子个数 Nupavg=0.25*eye(m,m); %将所有的<Nupi>取为1作初始值,自旋向上 Ndownavg=0.25*eye(m,m); %将所有的<Ndowni>取为1作初始值,自旋向下 u=0; %费米能级 Ncc=10; %迭代次数 dk=0.005; %布里渊区步长 T=0.038; %温度 U=1.5; %Hubbard系数 k=0:dk:2*pi; %布里渊区路径 nk=length(k); %

WebFlux快速上手

帅比萌擦擦* 提交于 2020-07-24 17:01:36
一、新建项目 示例使用IDEA快速创建基于SpringBoot的工程。 springboot 2.3.1 java 8 WebFlux 必须选用Reactive的库 POM 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> 二、Controller WebFlux 的Controller 可以沿用SpringMVC 的方式,但是返回结果需要使用Mono或者Flux。 创建一个接口,返回http状态码 import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ServerWebExchange; import

Proper way to create a Flux from a list of Mono's

有些话、适合烂在心里 提交于 2020-05-29 13:06:31
问题 Lets say I have a API operation that consumes a List of CustomObjects. For every one of those objects it calls a service method that creates a Mono. How do I create a Flux from those Mono objects in an idiomatic and therefore non-blocking way? What I've come up with for now is this. I changed the method names to better reflect their intended purpose. fun myApiMethod(@RequestBody customObjs: List<CustomObject>): Flux<CustomObject> { return Flux.create { sink -> customObjs.forEach { service

Proper way to create a Flux from a list of Mono's

匆匆过客 提交于 2020-05-29 13:06:23
问题 Lets say I have a API operation that consumes a List of CustomObjects. For every one of those objects it calls a service method that creates a Mono. How do I create a Flux from those Mono objects in an idiomatic and therefore non-blocking way? What I've come up with for now is this. I changed the method names to better reflect their intended purpose. fun myApiMethod(@RequestBody customObjs: List<CustomObject>): Flux<CustomObject> { return Flux.create { sink -> customObjs.forEach { service