文档章节

再说异步调用和NIO

令飞
 令飞
发布于 2015/08/15 11:47
字数 726
阅读 740
收藏 8

    之前的一篇博客阐述了在IO密集型事务中,使用异步调用的好处:http://my.oschina.net/zhenglingfei/blog/397514,本篇文章要说说使用异步调用和单纯使用NIO作为服务端的场景。

    目前大多是的java异步调用都是基于NIO来实现的 ,使用系统底层的select或epoll这样的模式,不过我要说的并不是这个,而是这里对于NIO的使用是用于客户端的,也就是调用者,才有了所谓的异步调用。这样的好处在于,调用者A对于服务端B有着大量的IO调用,而用异步的方式可以只用少量的线程去服务于大量的IO操作,而不同于传统的socket调用,一次调用发起便会阻塞调用线程,当调用量一大,自然cpu利用率下降。正如我第一篇文章所说。这边是用异步的好处,好处在于客户端,因此,这种形式一般适合于服务端间的调用,而非web端,移动端这样的调用,因为这种客户端本身的调用量就不大,异步更适合于SOA,微服务这样的服务化模式,有大量的服务间调用

    异步是针对客户端调用的好处,那么,nio用在服务端有什么好处呢,可以参见tomcat 6以后nio模式,个人认为,作为服务端,不存在调用阻塞的情况(如果有调用其他服务,这有属于作为客户端的范畴,这里不做考虑),此时采用nio模型的好处在于服务端可以同时监听多个连接,相比于传统的web服务器采用socket的模式,一次处理一个连接,然后交给一个线程处理,这类似一种生产消费者模式,生产者是对网络连接的处理,而消费者是对解码后的请求内容的业务处理,如果消费者速度恒定,那么整体吞吐能力在一定范围内会随着生产速度的提升而,因此对于业务处理简单的情况,消费者速度相对较快,因此,如果生产者较慢就会影响吞吐量。而且,对于并发量很大的服务,如日志服务,业务处理简单,但是量特别大,网卡很有可能被堵塞,并且整体吞吐也不高。

讲了这么多,是为了说明nio在服务端和客户端的区别,以便能更好的使用nio技术,后续会补上基于各种类型的业务的测试数据。

© 著作权归作者所有

共有 人打赏支持
令飞
粉丝 46
博文 21
码字总数 14127
作品 0
杭州
程序员
最近仔细研究了一下Java的NIO以及线程并发,搞清了点思路,特作笔记如下(NIO篇)

[转]http://www.cnblogs.com/feidao/archive/2005/07/15/193788.html 因为前段时间的项目需要写一些高性能服务器,结果写出来的结果是五花八门,我们要求使用NIO编写异步服务器,但是竟然有人...

风林火山
2010/12/26
0
1
SpringBoot | 第二十一章:异步开发之异步调用

前言 上一章节,我们知道了如何进行异步请求的处理。除了异步请求,一般上我们用的比较多的应该是异步调用。通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的。比如记录日...

oKong
08/17
0
0
Apollo 8 — ConfigService 异步轮询接口的实现

源码 Apollo 长轮询的实现,是通过客户端轮询 接口实现的。具体代码在 com.ctrip.framework.apollo.configservice.controller.NotificationControllerV2.java。 这个类也是实现了 ReleaseMes...

莫那-鲁道
07/31
0
0
初识NIO之Java小Demo

Java中的IO、NIO、AIO: BIO:在Java1.4之前,我们建立网络连接均使用BIO,属于同步阻塞IO。默认情况下,当有一条请求接入就有一条线程专门接待。所以,在客户端向服务端请求时,会询问是否有...

innoyiya
08/21
0
0
Linux IO模型与Java NIO

概述 看Java NIO一篇文章的时候又看到了“异步非阻塞”这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点。决定仔细研究一下。 本文试图研究以下问题...

yingtju
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
3
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
6
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
52
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部