传统同步阻塞式I/O模型(BIO)

简介: 传统BIO编程网络编程的基本模型是Client/Server模型,就是两个进程之间进行相互通信,Server端提供绑定的IP地址和监听端口,客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,建立成功之后就可以通过Socket通信。

传统BIO编程

网络编程的基本模型是Client/Server模型,就是两个进程之间进行相互通信,Server端提供绑定的IP地址和监听端口,客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,建立成功之后就可以通过Socket通信。在BIO模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作,连接成功后双方通过输入输出流进行BIO通信。

BIO通信模式

采用BIO通信模型的Server端,通常由一个独立的Acceptor线程负责监听客户端的连接,接受到服务端的请求后为每个客户端创建一个新的线程进行链路处理,处理完成后通过输出流返回应答给客户端,线程销毁。如图
image

基于BIO实现的TimeServer

https://github.com/chenjian44/netty_readings_note/tree/master/bio/SyncBlockingIO

弊端分析

缺乏弹性伸缩能力,当客户端访问量增加的时候,服务端的线程个数和客户端并发访问数为1:1的关系,由于线程是jvm宝贵的资源,线程膨胀之后,系统性能急剧下降,随着访问量继续增加,系统便会发生线程堆栈溢出、创建线程失败等问题,并最终导致宕机或者僵死,不能再对外提供服务。

伪异步IO编程

伪异步编程后端通过一个线程池来处理多个客户端的请求接入,形成客户端最大数M:和线程池最大数N的对应关系,M可以远大于N,通过线程池可以灵活调配线程资源,设置线程的最大值,防止由于海量线程并发接入导致线程耗尽。

伪异步通信模式

采用线程池和任务队列实现,当有新的客户端接入时,将客户端的Socket封装成一个Task(实现Runable接口)投递到后端的线程池中处理,JDK的线程池维护一个消息队列和N个活跃线程对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大的线程数,因此资源占用是可控的,所以更多客户端并发访问,并不会导致资源的耗尽和宕机。如图
image

伪异步IO实现的TimeServer

https://github.com/chenjian44/netty_readings_note/tree/master/bio/PseAsyncIO

弊端分析

伪异步IO的读和写操作都是同步阻塞的,阻塞的时间取决于对方IO线程的处理速度和网络IO的传输速度。因为无法保证生产环境的网络状况和端的应用程序足够快,它的可靠性就非常差。伪异步IO只是对之前IO线程模型的一个简单优化,无法从根本上解决同步IO导致的通信线程阻塞的问题。如果通信对方返回的应答时间过长,会引起的级联故障分析:

  • 服务端处理缓慢,返回应答消息耗费60s,平时只需要10s;
  • 伪异步IO的线程正在读取故障服务节点的响应,由于输入流是阻塞的,它也会被同步阻塞60s;
  • 假如所有的可用线程都被故障服务器阻塞,那后续的IO消息都将zai队列中排队;
  • 由于线程池采用阻塞队列实现,当队列积满后,后续入队的操作将被阻塞
  • 由于前端只有一个Acceptor线程接受客户端接入,它被阻塞在线程池的同步阻塞队列之后,新的客户端请求消息将被拒绝,客户端会发生大量的连接超时;
  • 由于几乎所有的连接都超时,调用者会认为系统已经崩溃,无法接受新的请求消息;
目录
相关文章
|
2月前
|
Java
如何理解网络阻塞 I/O:BIO
如何理解网络阻塞 I/O:BIO
|
3月前
|
负载均衡 NoSQL 网络协议
网络中的阻塞与非阻塞以及reactor模型
网络中的阻塞与非阻塞以及reactor模型
19 0
|
4月前
|
存储 网络协议 Java
深入理解Linux网络——内核与用户进程协作之同步阻塞方案(BIO)
在上一部分中讲述了网络包是如何从网卡送到协议栈的(详见深入理解Linux网络——内核是如何接收到网络包的),接下来内核还有一项重要的工作,就是在协议栈接收处理完输入包后要通知到用户进程,如何用户进程接收到并处理这些数据。
|
网络协议 Java
BIO 同步阻塞模型
BIO 同步阻塞模型
BIO 同步阻塞模型
NIO同步非阻塞模型学习使用
NIO同步非阻塞模型学习使用
NIO同步非阻塞模型学习使用
|
网络协议 编译器 测试技术
管道阻塞的机制|学习笔记
快速学习管道阻塞的机制
108 0
管道阻塞的机制|学习笔记
网络基础 - 同步、异步、阻塞、非阻塞
网络基础 - 同步、异步、阻塞、非阻塞
157 0
|
Java
一文读懂阻塞、非阻塞、同步、异步IO
原文:一文读懂阻塞、非阻塞、同步、异步IO 介绍     在谈及网络IO的时候总避不开阻塞、非阻塞、同步、异步、IO多路复用、select、poll、epoll等这几个词语。在面试的时候也会被经常问到这几个的区别。
5422 0
|
算法 安全
非阻塞同步算法实战(三)-LatestResultsProvider
阅读本文前,需要读者对happens-before比较熟悉,了解非阻塞同步的一些基本概念。本文主要为happens-before法则的灵活运用,和一些解决问题的小技巧,分析问题的方式。
135 0
非阻塞同步算法实战(三)-LatestResultsProvider
|
算法
非阻塞同步算法实战(一)
本文写给对ConcurrentLinkedQueue的实现和非阻塞同步算法的实现原理有一定了解,但缺少实践经验的朋友,文中包括了实战中的尝试、所走的弯路,经验和教训。
123 0

相关实验场景

更多