java异步io_java如何优雅实现并发io?

我觉得题主需要明确一下自己的需求是什么,一个服务调用,该等的时间是不得不等的。而且题目描述中,并没有说明这个服务A的使用场景:是再作为一个服务进行暴露呢,还是它本身就是一个服务消费方,负责消费服务B和服务C。

我理解一下你的意思,尝试归纳一下问题:

问题

你需要新写一个服务A,这个服务A依赖于高时延的服务B和C,

在B,C有结果后才能计算出结果并作为服务A的结果返回

服务A现在有两个可能的场景:服务A是C端的服务,也就是说,是一个调用方,比如在手机端进行两个服务的调用,并处理两个服务的结果,得到新的结果来填充某个字段。使用回调或者异步的方式进行。例如Android里有着各种回调供以调用,并要求延时任务不阻塞主线程;JS等也有异步操作,去处理这种情形。如果使用新的线程去做或者使用线程池反而引入了复杂度。

服务A是Server端的服务,需要封装B,C两个服务。

分析

这个情况我觉得大概率是题主遇到的问题。那么我们对服务A的设计目标就是,尽可能得提高服务A的服务能力,提高服务A的QPS。我们简化一下这个问题,问题等价于:

我们要构建一个服务,这个服务需要访问一个(我们简化成一个)耗时任务,这种情况下,应该怎么设计这个服务,并尽可能的提高并发量。

这里还存在一个问题,就是这个耗时任务究竟是什么任务。有两种情况:访问数据库这样的BIO任务

可以异步的任务。

对于情况一,没有别的什么办法,由于JDBC的限制,我们不得不去维护一个数据库连接池,进行BIO的操作

那么我们现在的问题就是,对于可以异步的耗时任务,我们如何构建一个服务,对它进行封装与其他的业务处理,并尽可能得提高我们写的服务的并发量。

答案很明显,为了提高我们的服务的并发量,我们应该尝试去使用IO多路复用技术,提高连接数;对于耗时任务使用异步任务进行处理。

对于Java生态来说,Netty是一个成熟而稳定的选择。那么问题就在于Netty是怎么做的呢?题主应该是一个新手,所以我推荐这个教程,给题主参考。sanshengshui/netty-learning-example​github.comd3d8a1eafc2d5bbabbbb8e6df170820b.png

那解决了IO多路复用的问题,我们如何解决异步的请求问题呢。

答案是,还是算了吧。比起使用异步来省点线程的消耗,使用Java来写异步代码带来的风险和心智负担costs more。同样,我们使用线程池的方式,在Netty中对耗时任务进行处理。

具体写法是

static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);

...

ChannelPipeline pipeline = ch.pipeline();

pipeline.addLast("decoder", new MyProtocolDecoder());

pipeline.addLast("encoder", new MyProtocolEncoder());

// Tell the pipeline to run MyBusinessLogicHandler's event handler methods // in a different thread than an I/O thread so that the I/O thread is not blocked by // a time-consuming task. // If your business logic is fully asynchronous or finished very quickly, you don't // need to specify a group. pipeline.addLast(group, "handler", new MyBusinessLogicHandler());

// 这里的MyBusinessLogicHandler就是一个耗时逻辑

有一个例子可以参考这里。

其他

还有一个问题就是,如果真的是像访问DB那样对耗时逻辑,除了使用连接池将DB连接异步化​github.comb7a89db4a1926445d21d00ee882c316a.png

总结业务还是要分析清楚,明白自己到底需要做什么

可以将Netty当作一个TCP连接管理器,解决C端发起的连接问题,提高连接利用效率

Netty中最好不要使用耗时任务

如果要使用,可以将其异步化或者使用线程池handle

话说回来。对于题主的问题,这篇回答其实没有正面回复。答案还是当然可以。比如你可以用异步的HttpClient发起请求

所以,浪费吗,,,没办法。。。it costs

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程介绍 【完善体系+精品资料】本课程总计115课时,打造全网最全的微服务体系课程;从微服务是什么、能够做什么开始讲起,绝对零基础入门到精通类型。课程整体脉络十分清晰,每个章节一个知识点,画图+源码+运行讲解,不信你学不会。1、课程先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。2、从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。3、讲解Spring Boot 与 Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码学习服务的远程调用。7、为了解决服务之间的稳定性,避免发生雪崩问题,我们引入了Hystrix断路器,服务降级和熔断机制。8、微服务集群十分庞大,监控起来是十分困难的,尤其是对每一个接口的熔断情况进行监控,因此我们引入了Turbine微服务监控。9、微服务的调用是杂乱无章的,可以网状调用,怎么做到统一的入口出口,统一的授权、加密、解密、日志过滤,我们引入了第一代网关Zuul。10、微服务的配置分散,每次要修改配置都要重启服务,因此我们引入了Config配置中心。11、跟上主流,Consul是当前主流的服务注册与发现、配置中心一体化的解决方案。12、阿里的Nacos服务注册与发现、配置中心在国内炙手可热,Nacos 经历过双十一的微服务中间件。13、Turbin做微服务监控还是太弱,我们需要更强大,可视化,操作性更强的监控系统,因此我引入了Spring Boot Admin体系。14、Zuul已经停止更新支持,Spring Cloud官方推荐的二代网关Spring Cloud Gateway更加强大。15、微服务的安全架构体系虽然复杂,但是是有学习条例的,什么是认证授权、什么是OAuth2.0的原理、 JWT、怎么样去开发实现。 课程资料 【独家资料】1、课程附带全部63个项目源码,其中Hoxton版本项目源码37个,Edgware版本项目26个,2、230页高清PDF正版课件。3、附带nacos、consul、cmder等视频配套软件。学习方法1、每一节课程均有代码,较好的方式为一边听我的讲解,一边使用我提供的项目代码进行观察和运行。2、课程体系庞大,但是并不杂乱,每个章节只针对一个知识点,减轻学习压力。3、坚持每天学习1~2个章节,可以在地铁、公交上用手机学习。【完善知识体系图】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值