async programming-2014-08-22-pub
TRANSCRIPT
在现在大规模高并发的 WEB 应用中,由于硬件及网络的限制, I/O 处理速度相当较慢,往往成为 WEB 系统的性能瓶
颈。
异步编程模型
PersiaCai2014-08-22
初衷:避免阻塞 -> 提升吞吐量
TCP
HTTP
Servelt
OS/IO
JAVA IO
Http Server
规范及实现
Client-Server
HTTP1.0 -> HTTP1.1
Web 技术的发展
1 、 http 短连接
2 、 http 长连接轮询 ->Comet
3 、 http1.1 持久连接->WebSocketConnection: keep-alive
轮询 ->Comet->WebSocket1 、轮询:客户端定时发请求,询问数据准
备好了没有2 、 Comet :像彗星滑落天空一样( 1 ) Long Polling ,等待服务端响应后继
续发起下一个请求( 2 ) Streaming ,客户端在 timeout 后
发起下一次请求3 、 WebSocket : http1.1 , persistent
connection
轮询: polling
Comet 实现 1 : long polling
( 1 )由客户端发起 http 请求,服务器收到这个请求后,进入一个 while(ture) 的循环,当有数据需要告知客户端时,将数据响应给客户端,并断开连接。
( 2 )客户端收到信息后进行处理,处理完成后再次发起新的请求,这就是长轮询的长连接实现。当然,客户端一般都采用ajax 方式发起请求。
Comet 实现 2: streaming
在流方式中,服务器推数据返回客户端,但不关闭连接,连接始终保持,
直到超时,超时后通知客户端重新建立连接,并关闭原来的连接。
Comet-> 长连接基于 Http 长连接的服务端推送技术
WebSocket-> 持久连接http1.1 persistent connection
持久连接
The Http Server Side
目录1 、对底层请求的异步 java nio/ nio22 、对上层请求的异步 Servlet3 Async Context3 、中间层的异步 Future/Promise, AKKA
底层 IO 请求与处理的异步
Old IO
Classic Service Designs
BIO 通信模型
同步阻塞 IO 服务模型(一客户端一线程) Non-scalable 当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈现
1:1 的关系; 线程数膨胀,系统性能急剧下降,线程堆栈溢出,创建新线程失败,进程
僵死 / 系统宕机 / 对外服务不可用
伪异步 IO
通过线程池来处理多个客户端的请求接入,形成客户端数 M :线程池最大线程数 N 的比例关系,通过线程池缓冲,避免海量并发导致线程耗尽
避免了为每个请求都创建一个独立线程,但是底层通信仍然采用的是 BIO 模型,这种称为伪异步 IO
当队列积满之后,后续入列操作被阻塞,新的客户端请求被被拒绝,客户端发生大量的连接超时
NIO
经典 NIO 异步模型—多线程版
传统: CPU 等待 IO 完成
零拷贝技术
CPU 只是发出写操作这样的指令, DMA 具体执行,从内存中读取数据,然后写到磁盘,当完成写后发出一个中断事件给 CPU ,这段时间 CPU 是空闲的
接收请求与处理请求的异步
Servlet3 AsyncContext
Spring MVC 3.2Callable,DefferedResult,WebA
syncTask
Async in app
Future-Promise
1 、 Guava
Like js?
Q
A