jvm高并发_JVM上的高并发HTTP客户端

jvm高并发

HTTP可能是最流行的应用程序级别协议,并且有许多库在网络I / O之上实现它,这是常规I / O的一种特殊(面向流)情况。 由于所有I / O都有很多共同点1 ,所以让我们开始对其进行一些讨论。

我将集中讨论具有大量并发HTTP请求的I / O情况,例如微服务,其中一组较高级别的HTTP服务会调用多个较低级别的HTTP服务,其中一些并发调用是由于数据依赖性而依次执行的。

当满足许多此类请求时,同时打开的连接总数有时会变大; 是否存在数据依存关系,或者较低级别的服务速度较慢(或由于特殊情况而减慢了速度)。 因此,微服务层往往需要许多并发的,可能长期存在的连接。 看看我们有多少打开的连接需要支持没有崩溃让我们回忆一下利特尔法则是正在进行中的请求数,ρ是平均到达率和τ是平均完成时间的平均值:

Ψ=ρτ

我们可以支持的正在进行中的请求数量取决于语言运行时,操作系统和硬件; 平均请求完成时间(或等待时间)取决于我们满足请求所必须执行的操作,当然包括对任何较低级别服务的调用,对存储的访问等。

我们可以支持多少个并发HTTP请求? 每个都需要一个开放的连接和一些可运行的原语,这些原语可以使用syscalls对其进行读取/写入。 如果内存,I / O子系统和网络带宽可以保持同步,则现代OS可以支持成千上万的开放TCP连接。 它们提供的用于套接字的可运行原语是线程 。 线程比套接字要重得多:运行现代操作系统的单个盒子只能支持5000-15000个线程。

从10,000英尺开始:JVM上的I / O性能

如今,JDK线程是大多数平台3上的OS线程,但是如果在任何时候只有很少的并发连接,那么“每个连接的线程”模型就可以了。

如果没有呢? 这个问题的答案随着历史的变化而改变:

  • JDK 1.4之前的版本仅具有调用操作系统线程阻塞I / O的库( java.io pkgs),因此只能使用“每连接线程”模型或线程池4 。 如果您想要更好的东西,可以通过JNI来利用操作系统的其他功能。
  • JDK 1.4添加了非阻塞I / O或NIO( java.nio包),仅在可以立即完成连接时才可以从连接读取/写入数据,而不必让线程进入睡眠状态。 更重要的是,它增加了一种方法,使一个线程可以通过套接字选择在许多通道上有效地工作,这意味着要求OS阻止当前线程,并在有可能立即从至少一个套接字中立即接收/发送数据时解除阻塞。一套。
  • JDK 1.7添加了NIO.2,也称为异步I / O(仍为java.nio软件包)。 这意味着要求OS仅在I / O完成时才在后台完全执行I / O任务,并稍后稍后唤醒带有通知的线程。

从JVM调用HTTP

JVM提供了多种开源HTTP客户端库。 线程阻塞API易于使用和维护,但对于许多并发请求而言可能效率较低,而异步请求有效但较难使用。 异步API也会通过异步对代码产生病毒影响:任何使用异步数据的方法本身都必须是异步的,或者阻塞并抵消了异步的优势。

以下是Java和Clojure的开源HTTP客户端的选择:

  • Java
    • JDK的URLConnection使用传统的线程阻塞I / O。
  • Clojure
    • clj-http包装Apache HTTP客户端。

从10,000英尺开始:轻松

由于Java线程占用大量资源 ,因此,如果要执行I / O并扩展到许多并发连接,则必须使用NIO或异步NIO。 另一方面,它们很难编码和维护。 有解决这个难题的方法吗?

如果线程不繁重,我们可以使用简单的阻塞I / O,那么我们的问题确实是: 我们是否可以拥有足够便宜的线程 ,并且可以创建比OS线程大得多的线程?

目前,JVM本身不提供轻量级线程,但Quasar借助光纤 (在用户空间中实现的非常有效的线程)来解救。

从JVM调用HTTP

Comsat将现有的某些库与Quasar纤维集成在一起。 Comsat API与原始API相同,“ HTTP客户端”部分 )说明了如何将其挂钩; 其余的只需确保您正确运行Quasar ,在需要执行新的HTTP调用时启动光纤,并使用以下一个(或多个)光纤阻塞API(或从模板和示例中汲取灵感:

  • Java的
    • Apache HTTP客户端 API的广泛子集,通过桥接异步者集成。
  • Clojure
    • 通过桥接http-kit的异步API集成了clj-http API的广泛子集。

可以轻松添加新的集成 ,当然也总是欢迎您提供贡献。

JBender的一些负载测试

jbender是Pinterest基于Quasar的网络负载测试框架。 它高效而灵活,但是由于Quasar光纤阻隔,其源代码很小且易于阅读; 使用它就像使用传统的线程阻塞I / O一样简单。

考虑这个项目 , 该项目建立在JBender之上,并以少量代码为所有Comsat集成库提供HTTP负载测试客户端,无论是其原始线程阻塞版本还是Comsat的光纤阻塞版本。

JBender可以使用任何(普通,重量级,OS)线程或光纤来执行请求,它们均被Quasar提取为共享的抽象类Strand ,因此线程阻塞和光纤阻塞版本共享HTTP代码:这证明了Comsat集成的API与原始API完全相同,并且光纤和线程的使用方式完全相同。

负载测试客户端接受参数以自定义其运行的几乎每个方面,但是我们将考虑的测试案例如下:

  1. 41000个寿命长的HTTP连接以尽可能高的速率触发。
  2. 执行10000个请求(加上1000个初始客户端和服务器预热),每个请求持续1秒,目标速率为1000 rps。
  3. 执行10000个请求(加上1000个初始客户端和服务器预热),每个请求持续100毫秒,目标速率为10000 rps。
  4. 执行10000个请求(加上1000个初始客户端和服务器预热),并立即做出答复,目标速率为100000 rps。

所有测试均针对运行Dropwizard的服务器触发,该服务器经过优化,可在HTTP服务器端使用带comsat-dropwizard以实现最大的并发性。 服务器仅用“ Hello!”答复任何请求。

以下是有关我们的负载测试环境的一些信息:

表格1

第一个重要的结果是, 基于Comsat的客户端在不使用光纤模式的情况下赢得了成功 。 Apache用于许多持久连接,而OkHttp用于许多短期请求,这些请求具有很高的目标速率,堆的大小也较小(分别为990 MiB和3 GiB,为简洁起见仅显示第一个):

表2 表2.1

OkHttp在快速请求的速度和内存利用率方面表现出色。 JVM的光纤版本使用异步API,并且即使底层机制是线程池提供的传统阻塞I / O,其性能也显着提高。

更令人印象深刻的是基于http-kit的光纤阻塞comsat-httpkit击败传统clj-http客户端的方法(仍然显示出很小的堆):

表3

也有其他Jersey提供程序(Grizzly,Jetty和Apache),但Jersey证明是最差的,其占用空间通常更大,并且异步接口(由Comsat的光纤阻塞集成使用)不幸地为每个线程生成并阻塞了一个线程。每个请求; 由于这个原因(也可能是由于每个提供商的实施策略),光纤版本有时会提供明显的性能优势,而有时却没有。 无论如何,这些数字并不像Apache,OkHttp和http-kit的数字那么有趣,因此我不在这里包括它们,但是请让我知道您是否希望看到它们。

(可选)从100 <10,000英尺开始:有关JVM上I / O性能的更多信息

因此,您想知道为什么在高度并发的情况下光纤比线程更好。

当只有少数并发套接字打开时,OS内核可以以非常低的延迟唤醒被阻塞的线程。 但是OS线程是通用的,并且在许多用例中会增加可观的开销:它们消耗大量内核内存用于簿记,同步syscall可能比过程调用慢几个数量级, 上下文切换昂贵 ,并且调度算法过于笼统。 。 所有这些意味着,对于具有大量通信和同步的细粒度并发,或者对于通常具有高度并发性的系统6而言,当前OS线程并不是最佳选择。

阻止I / O系统调用确实可以无限期地阻止昂贵的OS线程,因此,当您为大量并发连接提供服务时,“每连接线程”方法将很快导致系统崩溃。 另一方面,使用线程池可能会使“可接受的”连接队列溢出,因为我们无法保持到达速度或至少导致不可接受的延迟。 相反,“每连接光纤”方法是完全可持续的,因为光纤非常轻便。

总结一下 :线程可以通过较少的并发连接来改善延迟,而光纤可以在有许多并发连接的情况下改善吞吐量。

当然,光纤需要在活动的OS线程之上运行,因为OS对光纤一无所知,因此Quasar在线程池上调度了光纤。 Quasar只是一个库,并且完全在用户空间中运行,这意味着执行syscall的光纤将在整个调用持续时间内阻塞其底层的JVM线程,从而使其他光纤无法使用它。 这就是为什么这样的调用越短越重要,尤其是它们不应等待很长时间甚至无限期地等待:在实践中,光纤仅应执行非阻塞 syscall。 那么,如何使阻塞的HTTP客户端在光纤上运行得如此好呢? 由于这些库还提供了非阻塞(但不方便)的API,因此我们将异步API转换为光纤阻塞的API,并使用它来实现原始的阻塞API。 新的实现(非常简短,只不过是一个包装器)将:

  1. 阻止当前的光纤。
  2. 启动等效的异步操作,然后传入完成处理程序,该处理程序将在完成后取消阻塞光纤。

从光纤(和程序员)的角度来看,在I / O完成后,库调用之后将重新开始执行,就像使用线程和常规线程阻塞调用一样。

结语

借助Quasar和Comsat,您可以轻松地用Java,Clojure或Kotlin编写和维护高度并发且HTTP密集的代码,甚至可以选择自己喜欢的HTTP客户端库,而无需任何API锁定。 您还想使用其他东西吗? 让我们知道,或者自己将其与Quasar集成。

  1. …还有很多不同之处,例如文件I / O(面向块)支持内存映射的I / O,而这与面向流的I / O毫无意义。
  2. 阅读此博客文章以进一步讨论。
  3. 在1.2之前(只有) Green Threads时不是这样。
  4. 使用线程池意味着专用或有限数量的线程(或 )来完成某种类型的任务,在这种情况下,它服务于HTTP请求:进入的连接被排队,直到池中的线程可以自由地为其服务(如顺便说一句,“连接池”是完全不同的,并且最常见的是重用数据库连接。
  5. 请查看此介绍以获得更多信息。
  6. 例如,如果要了解有关实现光纤的原因和方式的更多信息,请阅读this , this和this以获得更多信息和基准,以及在ZeroTurnaround RebelLabs博客上的客座帖子 。

翻译自: https://www.javacodegeeks.com/2015/12/high-concurrency-http-clients-jvm.html

jvm高并发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter 采样器作用_实施自定义JMeter采样器

jmeter 采样器作用随着我们采用不同的体系结构和实现方式&#xff0c;对通用压力测试工具的需求不断增长。 关于负载测试&#xff0c; Apache Jmeter是最知名的工具之一。 它支持许多协议&#xff0c;例如ftp http tcp&#xff0c;并且可以轻松地用于分布式测试。 Jmeter还为…

xp系统 javafx_使用JavaFX构建React系统

xp系统 javafxJavaFX是用于在Java中构建图形应用程序的新标准库&#xff0c;但是许多程序员仍然对Swing甚至&#xff08;高音&#xff09;AWT感到困惑。 在Java诞生20年来&#xff0c;发生了很多事情。 两年前&#xff0c;当我开始研究Speedment UI的JavaFX库时&#xff0c;我发…

html手机端图片点击放大缩小快捷键,PS放大缩小图片的快捷键是什么?PS放大缩小图片的操作技巧...

PS放大缩小图片的快捷键是什么&#xff1f;PS怎么放大缩小图片&#xff1f;使用PS处理图片可是个精细的活儿&#xff0c;为了让图片处理得更加完美&#xff0c;我们经常需要将图片放大来处理&#xff0c;修改好之后又要缩小图片看下整体效果&#xff0c;这样来回切换其实挺麻烦…

webstorm html代码提示设置,Webstorm设置代码提示

下载路径&#xff1a; https://github.com/virtoolswebplayer/ReactNative-LiveTemplate本插件可以配合Webstorm设置代码提示。Mac下安装Webstorm2016.1为例安装路径在终端&#xff1a;$ cd ~/Library/Preferences/$ ls找到Webstorm版本$ open WebStorm2016.1先将ReactNative.x…

arcgis adf数据_使用ADF列表视图的主从数据

arcgis adf数据从UI角度来看&#xff0c;最近ADF Faces 表组件不再被认为很酷。 对于显示数据集合&#xff0c; 列表视图今天应该很酷。 这并不意味着我们根本不应该使用af&#xff1a;table 。 在某些情况下&#xff08;经常是:)&#xff09;&#xff0c;表比列表视图更适合。…

javafx 内存占用_JavaFX:TouchGesture内存泄漏?

javafx 内存占用在我的一个项目中&#xff0c;最近几天我在与内存泄漏作斗争&#xff08;是……“耦合”&#xff09;&#xff0c;我得出的结论是可能存在与触摸/滚动手势有关的问题。 在下面的示例中&#xff0c;我有两个按钮。 第一个创建具有一千行的列表视图&#xff0c;第…

cucumber jvm_用Cucumber JVM编写BDD测试

cucumber jvmCucumber JVM是编写BDD测试的出色工具。在本文中&#xff0c;我想对Cucumber JVM的BDD进行介绍。 让我们开始吧… 什么是BDD&#xff1f; 简而言之&#xff0c;BDD试图解决“通过示例理解需求”的问题 BDD工具 有许多可用于BDD的工具&#xff0c;有趣的是&#…

模拟模型学习 几何布朗运动_Java的几何布朗运动

模拟模型学习 几何布朗运动维纳过程是一个连续时间的随机过程&#xff0c;以纪念诺伯特维纳。 通常用于用随机成分表示噪音或财务状况。 可以计算几何布朗运动以可视化某些界限&#xff08;以分位数表示&#xff09;以暗示绝对范围。 为了进行计算&#xff0c;需要以下参数&am…

动态调整线程池_调整线程池的重要性

动态调整线程池无论您是否知道&#xff0c;您的Java Web应用程序很可能都使用线程池来处理传入的请求。 这是许多人忽略的实现细节&#xff0c;但是迟早您需要了解如何使用该池以及如何为您的应用程序正确调整池。 本文旨在说明线程模型&#xff0c;线程池是什么以及正确配置线…

java系统架构师有的特质_Java中特质模式的定义

java系统架构师有的特质在本文中&#xff0c;我将介绍特征的概念&#xff0c;并为您提供一个具体示例&#xff0c;说明如何在Java中使用它们以减少对象设计中的冗余。 我将首先提出一个虚构的案例&#xff0c;其中可以使用特征来减少重复&#xff0c;然后以使用Java 8的特征模式…

tdd java_Java TDD简介–第2部分

tdd java再次问好&#xff01; 在上一篇博客文章中&#xff0c;我在没有紧密引用Java的情况下总体上解释了TDD理论 &#xff0c;但是在这一部分中&#xff0c;我们开始进行TDD实践。 我们的目标是遍历TDD的所有阶段&#xff1a;从需求分析到测试代码的重构。 我们将在具有Java&…

计算机怎么没有桌面文件夹名称大全,你的电脑文件总是找不到?是时候学习文件夹分类整理了...

我们常常说做好办公整理&#xff0c;我们工作起来才更有效率&#xff1b;此处的办公整理不单单是对办公桌整理整齐&#xff0c;电脑里面的文件也需要定期整理&#xff0c;你有没有发现常常找一个文件的时候却总是找不到&#xff1f;那么此时就应该学习文件夹分类整理了&#xf…

selenide_使用Selenide进行有效的UI测试

selenide等待奇迹 圣诞节是奇迹的时刻。 在新的一年的前夕&#xff0c;我们都会制定下一个计划。 我们希望所有问题都将在最后一年消失&#xff0c;在来年出现奇迹。 每个Java开发人员都梦想着奇迹&#xff0c;使他成为世界上最有效的Java开发人员。 我想向你展示这样的奇迹…

win10无法更改计算机设置,Win10“无法保存ip设置,请检查一个或多个设置并重试”的解决方法...

近期有网友想要在Win10系统中手动设置本机IP地址&#xff0c;但是填写完毕之后却提示了“无法保存ip设置,请检查一个或多个设置并重试”&#xff0c;那么遇到这个问题&#xff0c;我们要如何解决呢&#xff1f;下面装机之家分享一下Win10“无法保存ip设置,请检查一个或多个设置…

24段魔尺拼图指南_拼图项目动手指南

24段魔尺拼图指南Jigsaw项目将把模块化引入Java平台&#xff0c;根据原始计划&#xff0c;它将在12月10日完成功能。 所以我们在这里&#xff0c;但拼图在哪里&#xff1f; 在过去的六个月中肯定发生了很多事情&#xff1a; 原型问世 &#xff0c;内部API的迫在眉睫的删除引起…

sql 解析 java_将Java 8流解析为SQL

sql 解析 java当Java 8发行并且人们开始流式处理各种东西时&#xff0c;不久之后他们就开始想象如果可以以相同的方式使用数据库将有多大的潜力。 本质上&#xff0c;关系数据库由以表状结构组织的巨大数据块组成。 这些结构非常适合进行过滤和映射操作&#xff0c;如SQL语言的…

杭州电子科技大学保研计算机,杭州电子科技大学计算机学院计算机科学与技术(一级学科)保研细则...

杭州电子科技大学计算机学院计算机科学与技术(一级学科)保研细则信息&#xff0c;是考研之前需要获取相应的考研信息&#xff0c;比如考试大纲、招考专业、招考目录等等基本信息&#xff0c;这些内容是进行考研前期工作的必要准备。考生可以从各院校的研招网进行查询&#xff0…

返回路径平面上的间隙_裁切机的上刀下刀如何调整?

每天都在使用裁切机时&#xff0c;由于各种因素往往会出现上刀、下刀现象(也称凸刀、凹刀现象)&#xff0c;给后面的套准带来困难。在此小编对上刀、下刀现象的产生原因做一分析与总结。01千斤压力不够(1)机械压力弹簧弹力不够。此时必须增大压力&#xff0c;如果增大到最大位置…

pcb板材的tg是什么_做到这6点,PCB过回焊炉不会出现板弯及板翘!

【维文信PCBworld】在PCB板子过回焊炉容易发生板弯及板翘&#xff0c;大家都知道&#xff0c;那么如何防止PCB板子过回焊炉发生板弯及板翘&#xff0c;下面就为大家阐述下&#xff1a;1.降低温度对PCB板子应力的影响既然「温度」是板子应力的主要来源&#xff0c;所以只要降低回…

java-ee-api_刷新器-Java EE 7概览

java-ee-api随着红帽JBoss企业应用平台7&#xff08;EAP 7&#xff09;的迫在眉睫&#xff0c;甚至WebLogic Server刚刚获得Java EE 7认证&#xff0c;我认为现在应该是时候对Java Enterprise Edition 7进行一些更新了。功能&#xff0c;并指向更多资源。 Java EE 7 –开发人员…