响应式编程实现异步RPC,提升xxl-job调度吞吐量-程序员宅基地

技术标签: python  java  网络  数据库  分布式  

在xxl-job中,RPC即用于调度中心请求执行器执行job、kill job,也用于执行器请求调度中心主动注册、执行结果上报。

xxl-job实现的RPC类似Feign框架,是基于http这种七层协议实现的,而http协议是无状态的,因此一个连接不能同时被用于多个线程发送请求,只能等待一个请求响应后再放入连接池被其它线程使用。

对于执行器而言,由于只与调度中心交互,请求量也少,因此这种RPC实现不会对执行器性能有什么影响。

调度中心则不同,它需要同时与多个执行器交互,如果同一时刻需要下发几百个执行job的请求给执行器,使用这种阻塞的RPC,意味着需要开启几百个线程,使用几百个连接发送请求,而这几百个线程都需要阻塞等待响应,Job越多,需要的线程数就会越多,对调动中心的性能影响就越大。

xxl-job即便更新到最新的2.x版本,也存在性能问题,无非就是使用了分布式锁与使用同步阻塞的RPC调用。

知道了为什么同步RPC会影响调度中心的性能,再来理解为什么异步RPC能解决这个问题的原因就容易很多。

响应式编程通过事件触发回调解决同步阻塞问题,要求整条链路上都无阻塞,即无I/O阻塞(数据库操作、网络请求响应等)。

我们重构后的新版本调度中心(xxl-job),我们使用了reactor-netty-http框架实现异步RPC,当然,我们需要解决的只是调度中心的性能问题,因此执行器是可以不用改动的、兼容旧版本的。

reactor-netty-http并非解决http这种协议的无状态问题,依然一个连接同时只能用于发送一个请求,需要等待响应后才能被用于发送其它请求。但reactor-netty-http不会创建一个线程去阻塞等待,而是通过事件轮询方式,去消费响应,释放连接回连接池。

在使用reactor-netty-http之后,我们只需要配置CPU核心数个工作线程处理向执行器发送RPC请求,reactor-netty-http在一个线程上完成请求发送后,就会继续处理其它请求发送,当轮询到某些连接收到客户端响应事件后,再处理这些响应,释放连接回连接池,调回doNext。

最终从效果上看,基于reactor-netty-http实现的RPC,类似于dubbo使用长连接实现的异步RPC。

98efedd6b247a9af372a7cb65ec820fb.png

reactor-netty-http可能会创建大量连接,但不会创建大量线程,可用使用netstat观察连接数的增长,使用jstack工具观察reactor-netty-http创建的线程数。

要解决调度的性能问题,除了异步RPC是不够的,异步RPC只能帮我们解决下发请求的阻塞问题。而且响应式编程要求整个链路上必须无阻塞。那么异步回调的事件消费也必须是异步的。

同时,我们将执行器节点信息、Job数据也完全存储在内存中,让触发->job查询->执行器查询->执行器节点查询->日记打印->调度下发整条链路都完全无阻塞。而数据的一致性,则通过分布式一致性算法保证,为了稳定以及开发简单,我们基于zookeeper实现。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_28523317/article/details/122151060

智能推荐

自己写的轮播图,原生JavaScript,支持移动端触摸滑动。分页器圆点可以支持mouseover鼠标移入和click点击,面向对象思路_轮播图无缝链接带有小圆点且支持移动端触频滑动-程序员宅基地

文章浏览阅读529次。自己用原生javascript写的轮播图,分页器按钮Click点击与mouseover鼠标悬浮导航都支持。同时支持移动端触摸操作,自己写得感觉不足之处是图片滚动动画还不够平滑,再改改间隔与偏移量应该可以。函数接受参数应该改成对象更好,还没有改。感觉这次写的轮播图功能比较全面了哈。高手们请别笑话,不足请指正.上源码:先HTML:<!DOCTYPE html><html>&..._轮播图无缝链接带有小圆点且支持移动端触频滑动

LAMP服务架构之传统缓存机制(Ngins+PHP+Memcache)-程序员宅基地

文章浏览阅读339次。nginx - fastcgi - php - memcache 协同下的 请求的完整访问过程用户发送http请求报文给nginx服务器nginx会根据文件url和后缀来判断请求如果请求的是静态内容,nginx会将结果直接返回给用户; 如果请求的是动态内容,nginx会将请求交给 fastcgi客户端 ,通过 fastcgi_pass 将这个请求发送给 php-fpmphp-fpm 会将请求交给 wrapperwrapper 收到请求会生成新的线程调用 php动态程序解析服务器如果用

源码分析Skynet的Actor对等调度:理解不一样的任务调度机制_actor公平调度-程序员宅基地

文章浏览阅读566次。一、actor对等调度。二、调度流程源码分析:thread_worker()、struct skynet_context、skynet_context_message_dispatch()、dispatch_message()。三、c语言到lua的调用过程分析。_actor公平调度

全方面了解接口自动化,看完还不会你锤我-程序员宅基地

文章浏览阅读2.4w次,点赞222次,收藏1.1k次。一、自动化分类(1)接口自动化python/java+requests+unittest框架来实现 python/java+RF(RobotFramework)框架来实现——对于编程要求不高(2)Web UI功能自动化python/java+selenium+unittest+ddt+PO框架来实现 python/java+RFS(RobotFrameWork+Selenium)框架来实现——对于编程要求不高(3)App自动化python/java+appnium+unit_接口自动化

Java基础学习之Scanner对象_java扫描器代码-程序员宅基地

文章浏览阅读586次。通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取欠我们一般需要使用hasNext()与hasNextLine()来判断是否还有输入的数据。之前我们学的基本语法中,并没有实现程序和人的交互,但是java给我们提供了这样一个工具类,我们可以获取用户的输入。通过输出结果我们可以明显的看出区别,next方法并不能读取带空格的输入,而nextLine方法可以。java.util.Scanner 是java5的新特征,所以使用Scanner方法需要导入Scanner类。_java扫描器代码

Python快速入门学习笔记:第四天_sethour() takes 1 positional argument but 2 were g-程序员宅基地

文章浏览阅读240次。这个是为准备考研复试,希望做一个textCNN文本情感分析打语言基础的自学笔记,博主本身本科非计算机专业,如果网友们有幸看见本文,博客中内容如有疏漏,不吝赐教。第6节 类6.1 类定义  和之前所学习的面向对象的语言一样,Python也提供类的概念,同样适用关键字class定义一个类,一个类可以拥有一个对象的属性和方法。具体代码示例如下:class Student: ag..._sethour() takes 1 positional argument but 2 were given

随便推点

Python学习资料全面总结,真的对零基础很有用-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏52次。把手里积累了这么久的Python入门资料整理了一下,发现其实,有了这些,python入门真的不难,每天花点时间学,真的不会影响工作。下面一起来看看这些资料吧!可以学习python的地方 Python学习资料全部整理 Python可以做的事情 关于python的一些文章一、可以学习Python的地方1、实验楼:【Python基础+项目实战课程】https://www.lanqiao.cn/courses/13302、《笨办法学 Python》:这本书绝对是最简单的学习 Pyth.._python学习资料

Linux Centos yum/rpm 设置代理_linux 代理 rpm-程序员宅基地

文章浏览阅读1.2k次。yum 设置代理:vim /etc/yum.conf添加形如:proxy = http://user:pass@ip:portrpm 设置代理sudo rpm -Uvh https://xxxxx.rpm --httpproxy ip --httpport portreference: https://www.lightnetics.com/topic/3698/how-do-i-install-an-rpm-package-using-a-http-proxy..._linux 代理 rpm

Android中的图片处理(包括缓存、大小、优化等)_android 每秒收到30张图片怎么处理-程序员宅基地

文章浏览阅读3.1k次。加载一副位图到你的用户界面是很简单的,然而如果你需要马上加载一组更大的图片的话就会复杂的多.在许多情况下(例如有些组件像ListView,GridView以及ViewPager等),出现在屏幕上的图片总量,其中包括可能马上要滚动显示在屏幕上的那些图片,实际上是无限的. 那些通过回收即将移除屏幕的子视图的组件,内存使用得以保留.如果你不长期保持你对象的引用的话,垃圾收集器也会释放你所加载的位图内_android 每秒收到30张图片怎么处理

摄像头的RTSP视频如何用H5 来播放_h5直接播放rtsp视频-程序员宅基地

文章浏览阅读205次。我们公司开发的liveweb播放器是可支持H.264/H.265视频播放的流媒体播放器,性能稳定、播放流畅,可支持的视频流格式有RTSP、RTMP、HLS、FLV、WebRTC等,具备较高的可用性。支持h264、h265、AAC、G711等常见音视频格式。支持协议:RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、GB28181、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4、MP4、WebRTC。对外提供HTTP API二次开发接口;_h5直接播放rtsp视频

游标_java游标查询。前面的查询会释放吗-程序员宅基地

文章浏览阅读640次。使用select语句可以返回一个结果集,而如果需要对结果集中单独的行进行操作,则需要使用游标。优点: 在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 查询语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定_java游标查询。前面的查询会释放吗

从6大应用场景,看边缘计算落地生根_边缘站点应用-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏4次。云计算现状过去十几年的发展,云计算概念已经被越来越多的技术层、决策层、高级管理层人员所理解并接受,私有云、公有云、混合云的高速发展,使得业务入云已经成为企业数字化转型的的事实标准。企业云计算的落地,利用云计算中心的软件定义存储、软件定义网络、超融合等技术,将数据汇聚到云中心处理,并对云上业务集中管理,提供云原生的能力,为企业带来较高的经济效益,并逐渐降低运维成本。 随着 5G 通信技术的发展,越来越多的实时性强的业务开始兴起,如自动驾、AR/VR、智能家居、工业自动化等,传统的云计算加端业务的集中._边缘站点应用

推荐文章

热门文章

相关标签