提升系统可靠性的Java异步技术详解

需积分: 10 16 下载量 8 浏览量 更新于2024-07-19 收藏 868KB PDF 举报
Java异步技术原理和实践深入解析 在Java编程中,异步技术是一项关键技能,特别是在构建现代微服务架构和分布式系统中。本文由高级技术专家黄健敏撰写,旨在帮助开发者理解异步技术在解决复杂IT系统中的挑战和优化性能方面的重要性。 首先,文章探讨了微服务架构下的典型问题,如蜘蛛网式的拓扑关系和可能存在循环依赖的情况,这在实际应用中可能导致系统复杂度显著增加,业务参与者众多,调用链长且层次深,从而给开发和运维带来巨大压力。此外,由于系统的复杂性,各种故障如磁盘故障、网络中断、程序bug等随时可能发生,这些故障会导致服务质量和整体可靠性降低,资源利用率低,系统变得脆弱。 异步技术的核心在于缓解这些问题。它包括几个基本概念,如Linux/Unix系统中的PageCache(缓存)和内核态与用户态的数据缓冲区,这些机制减少了数据拷贝的开销。在I/O操作中,传统的阻塞I/O(如recvfrom)会将进程阻塞直到数据准备完毕,而非阻塞I/O则需要用户进程持续轮询。I/O多路复用和信号驱动I/O提供了一种更高效的方式,允许一个进程同时处理多个I/O请求。异步I/O则是关键,它让进程在数据准备完成前继续执行其他任务,通过异步回调或事件驱动模型来处理I/O结果,避免了阻塞和资源浪费。 进程调度在异步I/O中扮演重要角色,允许操作系统在等待I/O完成时进行其他任务,提高系统吞吐量。然而,处理异步I/O也涉及到上下文保存和恢复,包括计数器、寄存器和进程控制块(PCB)的管理,以及频繁的进程切换和上下文切换,这对CPU资源消耗较大。 在Java中实现异步I/O通常借助于NIO (New I/O) API或者第三方库如Netty,它们提供了异步套接字通道和事件驱动模型,简化了并发编程。通过非阻塞I/O和I/O多路复用,应用程序可以设计为在I/O密集型任务上表现出更好的性能。 学习和掌握Java异步技术是提高系统可扩展性、可靠性和响应速度的关键,对于处理大规模并发和复杂依赖的场景尤其重要。理解这些原理,并将其应用到实际项目中,可以帮助开发者构建更加健壮和高效的软件系统。
2017-04-21 上传
一个工作时写的工具包。实现了Java版的Promise 和 HttpClient。HttpClient 支持同步和异步两种方式,也支持多种不同实现。目前有Netty 和 Apache Compoenet两种实现。本次上传移除了Netty实现。主要解决生产环境中同步httpclient造成的IO阻塞问题。同步http请求将导致 tomcat 的业务线程被阻塞。一旦某接口网络出现问题,可能会阻塞tomcat业务线程,从而无法处理正常业务。很多公司使用另开线程池的方式进行异步调用来解决tomcat线程阻塞问题。但由于本系统中接口网络太不稳定,使用线程池也将导致线程池中的线程不断加大,不管使用怎样的线程池策略,最终要么线程池线程全部挂起,要么部分任务被延迟执行,要么丢失部分任务。这在我们的系统中仍然不能接受。因此才有了这个组件的开发。该组件是单线程非阻塞式的,类似于JS中的ajax请求。都使用单线程异步回调的方式。目前该组件已经初步测试通过。如果大家也需要这样的组件,可以下载尝试一下。所有关键注释都已经写了,如有不明白可以发送邮件 ath.qu.trues@gmail.com 代码分为3个maven模块。 commons-ext : 实现Promise commons-tools: 实现 异步httpclient commons-parent:父模块 测试代码在 commons-tools/src/test/java/HttpTest.java 中. 要求至少Java 8 版本。 注释已经写好。这里贴出异步的http部分测试代码。 /** * 异步方法的Fluent写法 */ public void testAsyncHttpFluent() { SimpleRequest.Get("http://www.baidu.com") .header("h1", "hv1") .header("h2", "hv2") .parameter("p1", "pv1") .parameter("p2", "pv2") .chartUTF8() .build() .asyncExecute() .then(SimpleAsyncHttpClient::asString) .then(html -> { System.out.println(html); }) .catching(Throwable::printStackTrace);//如果有异常,则打印异常 }