async programming-2014-08-22-pub

45
在在在在在在在在在在 WEB 在在在 在在 在在在在在在在在I/O 在在在在在在在在 在在在在 WEB 在在在在在在在

Upload: persiacai

Post on 10-Aug-2015

51 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Async programming-2014-08-22-pub

在现在大规模高并发的 WEB 应用中,由于硬件及网络的限制, I/O 处理速度相当较慢,往往成为 WEB 系统的性能瓶

颈。

Page 2: Async programming-2014-08-22-pub

异步编程模型

PersiaCai2014-08-22

Page 3: Async programming-2014-08-22-pub

初衷:避免阻塞 -> 提升吞吐量

Page 4: Async programming-2014-08-22-pub

TCP

HTTP

Servelt

OS/IO

JAVA IO

Http Server

规范及实现

Page 5: Async programming-2014-08-22-pub
Page 6: Async programming-2014-08-22-pub

Client-Server

HTTP1.0 -> HTTP1.1

Page 7: Async programming-2014-08-22-pub

Web 技术的发展

1 、 http 短连接

2 、 http 长连接轮询 ->Comet

3 、 http1.1 持久连接->WebSocketConnection: keep-alive

Page 8: Async programming-2014-08-22-pub

轮询 ->Comet->WebSocket1 、轮询:客户端定时发请求,询问数据准

备好了没有2 、 Comet :像彗星滑落天空一样( 1 ) Long Polling ,等待服务端响应后继

续发起下一个请求( 2 ) Streaming ,客户端在 timeout 后

发起下一次请求3 、 WebSocket : http1.1 , persistent

connection

Page 9: Async programming-2014-08-22-pub

轮询: polling

Page 10: Async programming-2014-08-22-pub
Page 11: Async programming-2014-08-22-pub

Comet 实现 1 : long polling

( 1 )由客户端发起 http 请求,服务器收到这个请求后,进入一个 while(ture) 的循环,当有数据需要告知客户端时,将数据响应给客户端,并断开连接。

( 2 )客户端收到信息后进行处理,处理完成后再次发起新的请求,这就是长轮询的长连接实现。当然,客户端一般都采用ajax 方式发起请求。

Page 12: Async programming-2014-08-22-pub
Page 13: Async programming-2014-08-22-pub
Page 14: Async programming-2014-08-22-pub

Comet 实现 2: streaming

在流方式中,服务器推数据返回客户端,但不关闭连接,连接始终保持,

直到超时,超时后通知客户端重新建立连接,并关闭原来的连接。

Page 15: Async programming-2014-08-22-pub
Page 16: Async programming-2014-08-22-pub
Page 17: Async programming-2014-08-22-pub

Comet-> 长连接基于 Http 长连接的服务端推送技术

WebSocket-> 持久连接http1.1 persistent connection

Page 18: Async programming-2014-08-22-pub

持久连接

Page 19: Async programming-2014-08-22-pub
Page 20: Async programming-2014-08-22-pub
Page 21: Async programming-2014-08-22-pub
Page 22: Async programming-2014-08-22-pub
Page 23: Async programming-2014-08-22-pub

The Http Server Side

Page 24: Async programming-2014-08-22-pub

目录1 、对底层请求的异步 java nio/ nio22 、对上层请求的异步 Servlet3 Async Context3 、中间层的异步 Future/Promise, AKKA

Page 25: Async programming-2014-08-22-pub

底层 IO 请求与处理的异步

Page 26: Async programming-2014-08-22-pub

Old IO

Page 27: Async programming-2014-08-22-pub

Classic Service Designs

Page 28: Async programming-2014-08-22-pub

BIO 通信模型

同步阻塞 IO 服务模型(一客户端一线程) Non-scalable 当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈现

1:1 的关系; 线程数膨胀,系统性能急剧下降,线程堆栈溢出,创建新线程失败,进程

僵死 / 系统宕机 / 对外服务不可用

Page 29: Async programming-2014-08-22-pub
Page 30: Async programming-2014-08-22-pub

伪异步 IO

通过线程池来处理多个客户端的请求接入,形成客户端数 M :线程池最大线程数 N 的比例关系,通过线程池缓冲,避免海量并发导致线程耗尽

避免了为每个请求都创建一个独立线程,但是底层通信仍然采用的是 BIO 模型,这种称为伪异步 IO

当队列积满之后,后续入列操作被阻塞,新的客户端请求被被拒绝,客户端发生大量的连接超时

Page 31: Async programming-2014-08-22-pub

NIO

Page 32: Async programming-2014-08-22-pub
Page 33: Async programming-2014-08-22-pub

经典 NIO 异步模型—多线程版

Page 34: Async programming-2014-08-22-pub

传统: CPU 等待 IO 完成

Page 35: Async programming-2014-08-22-pub

零拷贝技术

CPU 只是发出写操作这样的指令, DMA 具体执行,从内存中读取数据,然后写到磁盘,当完成写后发出一个中断事件给 CPU ,这段时间 CPU 是空闲的

Page 36: Async programming-2014-08-22-pub

接收请求与处理请求的异步

Page 37: Async programming-2014-08-22-pub

Servlet3 AsyncContext

Spring MVC 3.2Callable,DefferedResult,WebA

syncTask

Page 38: Async programming-2014-08-22-pub
Page 39: Async programming-2014-08-22-pub

Async in app

Future-Promise

Page 40: Async programming-2014-08-22-pub

1 、 Guava

Page 41: Async programming-2014-08-22-pub

Like js?

Page 42: Async programming-2014-08-22-pub
Page 43: Async programming-2014-08-22-pub
Page 44: Async programming-2014-08-22-pub

Q

A

Page 45: Async programming-2014-08-22-pub