Reactor

Are subscribers in Spring Reactor unbounded by default?

北战南征 提交于 2020-07-15 08:47:39
问题 I've been working in Spring Reactor and had some previous testing that made me wonder how Fluxes handle backpressure by default. I know that onBackpressureBuffer and such exist, and I have also read that RxJava defaults to unbounded until you define whether to buffer, drop, etc. So, can anyone clarify for me: What is the default backpressure behavior for a Flux in Reactor 3? I tried searching for the answer but didn't find any clear answers, only definitions of Backpressure or that answer

Are subscribers in Spring Reactor unbounded by default?

只愿长相守 提交于 2020-07-15 08:47:13
问题 I've been working in Spring Reactor and had some previous testing that made me wonder how Fluxes handle backpressure by default. I know that onBackpressureBuffer and such exist, and I have also read that RxJava defaults to unbounded until you define whether to buffer, drop, etc. So, can anyone clarify for me: What is the default backpressure behavior for a Flux in Reactor 3? I tried searching for the answer but didn't find any clear answers, only definitions of Backpressure or that answer

Celery worker hang when running with twisted

蓝咒 提交于 2020-06-25 07:11:57
问题 Below code snippet is the celery setup I have, Here I am running a twisted reactor in each child celery worker process. import os from threading import Thread from celery import Celery from twisted.internet import threads, reactor from celery import signals from twisted.internet.defer import inlineCallbacks, returnValue from twisted.internet.task import LoopingCall app = Celery('tasks', broker='pyamqp://guest@localhost//') @signals.worker_process_init.connect def configure_infrastructure(*

解Bug之路-中间件"SQL重复执行"

蹲街弑〆低调 提交于 2020-05-09 19:18:58
前言 我们的分库分表中间件在线上运行了两年多,到目前为止还算稳定。在笔者将精力放在处理各种灾难性事件(例如中间件物理机宕机/数据库宕机/网络隔离等突发事件)时。竟然发现还有一些奇怪的corner case。现在就将排查思路写成文章分享出来。 Bug现场 应用拓扑 应用通过中间件连后端多个数据库,sql会根据路由规则路由到指定的节点,如下图所示: 错误现象 应用在做某些数据库操作时,会发现有比较大的概率失败。他们的代码逻辑是这样: int count = updateSql(sql1); ... // 伪代码 int count = updateSql("update test set value =1 where id in ("100","200") and status = 1; if( 0 == count ){ throw new RuntimeException("更新失败"); } ...... int count = updateSql(sql3); ... 即每做一次update之后都检查下是否更新成功,如果不成功则回滚并抛异常。 在实际测试的过程中,发现经常报错,更新为0。而实际那条sql确实是可以更新到的(即报错回滚后,我们手动执行sql可以执行并update count>0)。 中间件日志 笔者根据sql去中间件日志里面搜索。发现了非常奇怪的结果,日志如下:

reactor.netty.http.client.HttpClient reactor.netty.http.server.HttpServe r metrics

对着背影说爱祢 提交于 2020-05-08 18:55:13
6.7. Metrics HTTP客户端支持与 Micrometer 内置集成. 它使用前缀 reactor.netty.http.client 公开所有度量. 下表提供了HTTP客户端指标的信息: 指标名称 type description reactor.netty.http.client.data.received DistributionSummary 接收到的数据量,以字节为单位 reactor.netty.http.client.data.sent DistributionSummary 发送的数据量(以字节为单位) reactor.netty.http.client.errors Counter 发生的错误数 reactor.netty.http.client.tls.handshake.time Timer TLS握手花费的时间 reactor.netty.http.client.connect.time Timer 连接到远程地址所花费的时间 reactor.netty.http.client.address.resolver Timer 解析地址所花费的时间 reactor.netty.http.client.data.received.time Timer 消耗传入数据所花费的时间 reactor.netty.http.client.data.sent

详细muduo的使用(一)——源码分析(架构和概念)

时间秒杀一切 提交于 2020-05-05 19:36:47
目录 Muduo是什么? muduo的架构和概念 一个简单的例子 连接的建立 消息的读取 消息的发送 为什么要移除可写事件 连接的断开 runInLoop的实现 为什么要唤醒EventLoop wakeup是怎么实现的 doPendingFunctors的实现 muduo的线程模型 主从reactor模式 业务线程池 总结 参考 Muduo是什么? muduo 是 陈硕 大神个人开发的C++的TCP网络编程库。muduo基于Reactor模式实现。Reactor模式也是目前大多数Linux端高性能网络编程框架和网络应用所选择的主要架构,例如内存数据库 Redis 和Java的Netty库等。 陈硕的《Linux多线程服务器端编程》一书对muduo整个架构进行了非常详尽的介绍和分析,可以说是学习muduo源码和设计理念最好的资料了。这本书也非常推荐大家购买阅读,感觉是后台开发的必读书目了。 而本文则主要是从源码角度辅助理解整个muduo的实现,同时也姑且算是对muduo的一个小小的补充。 同时提供了一个 muduo注释版 ,以辅助大家参考学习。 muduo的架构和概念 muduo中类的职责和概念划分的非常清晰,在《Linux多线程服务器端编程》一书的6.3.1章节有详细的介绍。实际上目前很多网络库的接口设计也都受到了muduo的影响,例如360的evpp等。

Spring-Cloud-Gateway 从升级到放弃

白昼怎懂夜的黑 提交于 2020-05-04 10:55:11
1 为什么要升级为spring-cloud-gateway? Spring Cloud Gateway features: Built on Spring Framework 5, Project Reactor and Spring Boot 2.0 Able to match routes on any request attribute. Predicates and filters are specific to routes. Hystrix Circuit Breaker integration. Spring Cloud DiscoveryClient integration Easy to write Predicates and Filters Request Rate Limiting Path Rewriting 这是官方说的,spring gateway相对spring zuul要新很多,应用也更加自由,开发体验更好。但是我在测试中发现,spring-cloud-gateway相对于zuul来说,更加出众的还是其性能,当然最后让我放弃的也是因为这一点。 网上的朋友也有做一些gateway和zuul的性能比较,大多的结论也是gateway要优于zuul,同时也更加稳定。 但是我们不能轻信,所以我也做了测试,这部分测试内容若不感兴趣可以跳过,zuul就不测试了。

【netty】(1)---BIO NIO AIO演变

自古美人都是妖i 提交于 2020-05-02 12:00:43
BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。 Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。 一、BIO的理解 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中 服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的 地址发送连接请求,通过三次握手建立连接 ,如果连接成功,双方就可以通过网络套接字(Socket)进行通信。在基于同步堵塞模式开发中, ServerSocket负责绑定Ip地址,启动监 听端口。Socket负责发起连接操作 。连接成功之后,双方通过输入和输出流进行同步堵塞式通信。 BIO流程图 BIO 全称Block-IO 是一种 阻塞同步的通信模式 。我们常说的StockIO一般指的是BIO。是一个比较传统的通信方式, 模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速 。 BIO 设计原理 : 服务器通过一个 Acceptor 线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。若客户端数量增多,频繁地创建和销毁线程会 给服务器打开很大的压力

Netty入门系列(1) --使用Netty搭建服务端和客户端

こ雲淡風輕ζ 提交于 2020-04-30 00:15:50
引言 前面我们介绍了网络一些基本的概念,虽然说这些很难吧,但是至少要做到理解吧。有了之前的基础,我们来正式揭开Netty这神秘的面纱就会简单很多。 服务端 public class PrintServer { public void bind(int port) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); //1 EventLoopGroup workerGroup = new NioEventLoopGroup(); //2 try { ServerBootstrap b = new ServerBootstrap(); //3 b.group(bossGroup, workerGroup) //4 .channel(NioServerSocketChannel.class) //5 .option(ChannelOption.SO_BACKLOG, 1024) //6 .childHandler(new ChannelInitializer<SocketChannel>() { //7 @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new

常见Bug之一,中间件的”SQL重复执行“

眉间皱痕 提交于 2020-04-29 03:16:55
分享分享自己收藏的学习资料,有需要的朋友可以找我获取 根据自身面试经历整理以及不断收集的(珍藏版) 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> https://www.cnblogs.com/xiaogeng88/p/12692306.html 我们的分库分表中间件在线上运行了两年多,到目前为止还算稳定。在笔者将精力放在处理各种灾难性事件(例如中间件物理机宕机/数据库宕机/网络隔离等突发事件)时。竟然发现还有一些奇怪的corner case。现在就将排查思路写成文章分享出来。 Bug现场 应用拓扑 应用通过中间件连后端多个数据库,sql会根据路由规则路由到指定的节点,如下图所示: 错误现象 应用在做某些数据库操作时,会发现有比较大的概率失败。他们的代码逻辑是这样: int count = updateSql(sql1); ... // 伪代码 int count = updateSql( "update test set value =1 where id in (" 100 "," 200 ") and status = 1; if( 0 == count ){ throw new RuntimeException("更新失败 "); } ...... int count = updateSql(sql3); ...