SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
基于Jetty的Comet应用
基于Jetty Comet应用
  Jetty的




           http://blog.csdn.net/liu251
目录


1   comet

2   应用

3   实现(jetty)
4   集群

5   服务器优化
Comet
• “服务器推”技术的应用
 – 监控系统
 – 即时通信系统:im
 – 即时报价系统:股票、证券

• 实现方案
 –   ActiveX
 –   Java Applet
 –   Flash XMLSocket
 –   JavaScript-Ajax
基于Http长连接的Comet
   基于Http 长连接的Comet
     Http长连接的
                                                A jax P u sh(Long poll)
          A ja x(p o llin g)

                                             Browser                 Server
Browser                        Server


            LifeC ycle                                 LifeC ycle
                                                       Request
            Request




                                                                          Suspend
           Response

                                    Even t             Response                     Event

           LifeC ycle
            Request                                    LifeC ycle
           Response                                    Request




                                                                          Timeout
                                                       Response
基于Http长连接的Comet
    基于Http 长连接的Comet
      Http长连接的
   A jax P u sh(Stream ing)                          W ebSocket


Browser                     Server         Browser                     Server


           LifeC ycle                                 LifeC ycle
           Request                                     Request



          Response                Even t              Response               Even t




                                                                   Timeout
                        Timeout




          Response                Even t              Response               Even t
应用
              • Ajax long poll



              • Streaming (iFrame)


http://2.113.web0.im.weibo.com/im?
jsonp=parent.org.cometd.script._callback79 &
message=%5B%7B%22channel%22%3A%22%2Fmeta%2Fconnect%22%2C%22connectionType%22%3A%22callback-polling%22%2C%22id%22%3A80%2C%22
clientId%22%3A%22sir4xctmetaqi52dtk%22%7D%5D&1340098082636
应用
•基于Jetty
  –   Google App Engine
  –   Taobao webIM
  –   Sina WeiboIM
  –   ......
•优点:
  – lightweight,mini,pluggable,nature async
•Anti-jetty
  – Grails内置server被转成tomcat
  – JBoss通信web容器被替换成tomcat
实现
•svn地址:https://svn.ws.netease.com/microblog/products/butter-
 svn 地址:https://svn.ws.netease.com/microblog/products/butter-
 svn地址:
microblog/branches/websocket-comet


•代码websocket-comet/src/test
 代码
 代码websocket-comet/src/test
   – 执行com.netease.samples.jetty.handler.HttpServletServer
     执行com.netease.samples.jetty.handler.HttpServletServer
 Jetty
•Jetty Continuation long polling
   – http://127.0.0.1:8080/testhtml/poll.html
 Jetty
•Jetty Continuation streaming
   – http://127.0.0.1:8080/testhtml/stream.html
•Servlet3 Stream
 Servlet3
   – http://127.0.0.1:8080/testhtml/stream2.html
 WebSocket
•WebSocket
   – http://127.0.0.1:8080/testhtml/websocket.html
实现
 效果图
•效果图
 long
•long polling
 http://127.0.0.1:8080
•http://127.0.0.1:8080
/testhtml/poll.html
效果图
•效果图                   实现
 streaming
•streaming   http://127.0.0.1:8080/testhtml/stream.html
效果图
•效果图                         实现
 WebSocket
•WebSocket http://127.0.0.1:8080/testhtml/websocket.html
实现
 Jetty
•Jetty Continuation Long polling/Streaming
   – 实现类:ScheduleContinuationServlet/ScheduleContinuationStreamServlet
     实现类:ScheduleContinuationServlet/ScheduleContinuationStreamServlet
   – 典型代码:
      • Continuation continuation =
                        ContinuationSupport.getContinuation(request);
      • continuation.suspend();
      • continuation.resume();
 Servlet3
•Servlet3 Streaming
   – 实现类:Schedule3StreamServlet
     实现类:Schedule3StreamServlet
   – 典型代码:
       •   AsyncContext asyncContext = request.startAsync();
       •   asyncContext .getResponse().getWriter().write();
 WebSocket
•WebSocket
   – 实现类:WebSocketLogServlet
     实现类:WebSocketLogServlet
   – 典型代码:
      • 实现WebSocketServlet抽象类
        实现WebSocketServlet
          WebSocketServlet抽象类
      • 实现WebSocket接口
        实现WebSocket
          WebSocket接口
实现
 Jetty
•Jetty Continuation / AsyncServlet Pattern
  – Suspend Resume Pattern:
                   Pattern:
     • Continuation :
        – Continuation continuation =
            ContinuationSupport.getContinuation(request);
        – continuation.suspend();/write()
        – continuation.resume();
     • AsyncServlet :
        – AsyncContext asyncContext =
          request.startAsync();/write()
        – asyncContext .dispatch();
实现
 Jetty
•Jetty Continuation / AsyncServlet Pattern
   – Suspend Continue Pattern:
                        Pattern:
     • Continuation :
       – Continuation continuation =
           ContinuationSupport.getContinuation(request);
       – continuation.suspend();
       – write(), continuation.complete();
     • AsyncServlet :
       – AsyncContext asyncContext = request.startAsync();
       – write(), asyncContext .complete();
实现



 应用程序保存当前异步请求的上下文数据
•应用程序保存当前异步请求的上下文数据
实现-Async
 Jetty
•Jetty Continuation/Servlet3
HttpServlet.service(ServletRequest req, ServletResponse res)
                                                                                    实现-Async流程
                                                                    IDLE

                                                                 h an d lin g( )

                                                                                    su sp en d( ) /
                                                                Dispatched                            Async Started    resu m e( ) /d isp at c h( )
                                                                                   startAsync( )


                                                                                                                                                su sp en d( ) /
                                                                Completing                                                                     startAsync( )
                                                                                                       Async Wait
                                                                                                                         R e-Dispatching

                                                                                                         tim eout
                                                               U n-Completed

                                                                                                       R e-Dispatch

                                                                Completed


                                                                                                      R e-Despatched
实现-浏览器
                  实现-


• 每个页面一个连接
• 多个页面共享一个链接
 – 轮询cookie
 – flash share object
 – html5 localStore
集群(WebSocket)
 浏览器窗口          浏览器窗口




           HAProxy



 Jetty集群

  Jetty       Jetty     Jetty
集群(WebSocket)
                        集群(WebSocket)
• HAProxy特性
   – 支持4层到7层协议(nginx支持7层),支持MySQL 负载均衡
   – 负载均衡算法
      •   roundrobin(static-rr)
      •   ip hash
      •   uri hash
      •   least connection
      •   url_param hash
      •   head["name"] hash
      •   cookie["name] hash
• 引入原因
   – url_hash
   – session 保持
   – 通过配置,支持WebSocket协议
集群(WebSocket)
         集群(WebSocket)
•环境
 –hardware:
 –linux version:
 –java version:
•测试
 – HAProxy(1) + Jetty(1)
 – 连接数:10w
 – 共2个客户端,每5w个WebSocket连接
集群(WebSocket)-服务端结果
集群(WebSocket)-
集群(WebSocket)-客户端结果
集群(WebSocket)-
服务器优化
• JVM
  –   -XX:+UseParallelGC
  –   -XX:+UseParallelOldGC
  –   -Xms2G
  –   -Xmx8G
  –   -XX:NewRatio=1
  –   -XX:PermSize=64m
  –   -XX:MaxPermSize=512m
• 代码
  – google guava cache
服务器优化
• Linux
  – TCP(client)

     • Caused by: java.net.BindException: Cannot assign requested address
     •     at sun.nio.ch.Net.connect(Native Method)
     •     at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:500)
     •     at org.eclipse.jetty.websocket.WebSocketClient.open(WebSocketClient.java:346)
     •     at org.eclipse.jetty.websocket.WebSocketClient.open(WebSocketClient.java:305)

  – 文件句柄(server)                                    TCP(Server)
                                                    #vi /etc/sysctl.conf
                                                    net.ipv4.tcp_tw_reuse = 1
                                                    net.ipv4.tcp_tw_recycle = 1
                                                    #sysctl -p
Q/A

Más contenido relacionado

La actualidad más candente

Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移wang hongjiang
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closureswang hongjiang
 
Reactive X 响应式编程
Reactive X 响应式编程Reactive X 响应式编程
Reactive X 响应式编程Jun Liu
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt锐 张
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Kris Mok
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收Tony Deng
 
Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer TalkLarry Cai
 
淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011Yiwei Ma
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)ddviplinux
 
Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫Kito Cheng
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应zhaolinjnu
 
人人网技术架构的演进
人人网技术架构的演进人人网技术架构的演进
人人网技术架构的演进Laobiao Li
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出wang hongjiang
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
开源Pass平台flynn功能简介
开源Pass平台flynn功能简介开源Pass平台flynn功能简介
开源Pass平台flynn功能简介Zhichao Liang
 
使用 Java 上的 future/promise API
使用 Java 上的 future/promise  API使用 Java 上的 future/promise  API
使用 Java 上的 future/promise APIkoji lin
 
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The HoodLarge-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The HoodLei (Harry) Zhang
 

La actualidad más candente (20)

Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
 
Reactive X 响应式编程
Reactive X 响应式编程Reactive X 响应式编程
Reactive X 响应式编程
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
 
JVM及其调优
JVM及其调优JVM及其调优
JVM及其调优
 
Nio trick and trap
Nio trick and trapNio trick and trap
Nio trick and trap
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收
 
Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer Talk
 
淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)
 
Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应
 
人人网技术架构的演进
人人网技术架构的演进人人网技术架构的演进
人人网技术架构的演进
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
 
线程与并发
线程与并发线程与并发
线程与并发
 
开源Pass平台flynn功能简介
开源Pass平台flynn功能简介开源Pass平台flynn功能简介
开源Pass平台flynn功能简介
 
使用 Java 上的 future/promise API
使用 Java 上的 future/promise  API使用 Java 上的 future/promise  API
使用 Java 上的 future/promise API
 
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The HoodLarge-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The Hood
 

Destacado

Rpc原理与实现
Rpc原理与实现Rpc原理与实现
Rpc原理与实现wavefly
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析wavefly
 
Head first in xmemcached yanf4j
Head first in xmemcached yanf4jHead first in xmemcached yanf4j
Head first in xmemcached yanf4jwavefly
 
Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析wavefly
 
ClassLoader简析
ClassLoader简析ClassLoader简析
ClassLoader简析wavefly
 
High performance network programming on the jvm oscon 2012
High performance network programming on the jvm   oscon 2012 High performance network programming on the jvm   oscon 2012
High performance network programming on the jvm oscon 2012 Erik Onnen
 

Destacado (6)

Rpc原理与实现
Rpc原理与实现Rpc原理与实现
Rpc原理与实现
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
Head first in xmemcached yanf4j
Head first in xmemcached yanf4jHead first in xmemcached yanf4j
Head first in xmemcached yanf4j
 
Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析
 
ClassLoader简析
ClassLoader简析ClassLoader简析
ClassLoader简析
 
High performance network programming on the jvm oscon 2012
High performance network programming on the jvm   oscon 2012 High performance network programming on the jvm   oscon 2012
High performance network programming on the jvm oscon 2012
 

Similar a The comet technology on Jetty

高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕ideawu
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)jeffz
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹My own sweet home!
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
实时Web的前世今生未来
实时Web的前世今生未来实时Web的前世今生未来
实时Web的前世今生未来RolfZhang
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Justin Lin
 
COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用ericpi Bi
 
關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版Kirk Chen
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践Li JianYe
 
為什麼 App 卡卡的
為什麼 App 卡卡的為什麼 App 卡卡的
為什麼 App 卡卡的鈺翔 林
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geekJohnson Gau
 
Akka分片集群的实现
Akka分片集群的实现Akka分片集群的实现
Akka分片集群的实现Caoyuan Deng
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战fengmk2
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renrend0nn9n
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-ControlMu Chun Wang
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战fengmk2
 

Similar a The comet technology on Jetty (20)

高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
实时Web的前世今生未来
实时Web的前世今生未来实时Web的前世今生未来
实时Web的前世今生未来
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
 
COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用
 
關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
 
為什麼 App 卡卡的
為什麼 App 卡卡的為什麼 App 卡卡的
為什麼 App 卡卡的
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek
 
Akka分片集群的实现
Akka分片集群的实现Akka分片集群的实现
Akka分片集群的实现
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战
 

The comet technology on Jetty

  • 1. 基于Jetty的Comet应用 基于Jetty Comet应用 Jetty的 http://blog.csdn.net/liu251
  • 2. 目录 1 comet 2 应用 3 实现(jetty) 4 集群 5 服务器优化
  • 3. Comet • “服务器推”技术的应用 – 监控系统 – 即时通信系统:im – 即时报价系统:股票、证券 • 实现方案 – ActiveX – Java Applet – Flash XMLSocket – JavaScript-Ajax
  • 4. 基于Http长连接的Comet 基于Http 长连接的Comet Http长连接的 A jax P u sh(Long poll) A ja x(p o llin g) Browser Server Browser Server LifeC ycle LifeC ycle Request Request Suspend Response Even t Response Event LifeC ycle Request LifeC ycle Response Request Timeout Response
  • 5. 基于Http长连接的Comet 基于Http 长连接的Comet Http长连接的 A jax P u sh(Stream ing) W ebSocket Browser Server Browser Server LifeC ycle LifeC ycle Request Request Response Even t Response Even t Timeout Timeout Response Even t Response Even t
  • 6. 应用 • Ajax long poll • Streaming (iFrame) http://2.113.web0.im.weibo.com/im? jsonp=parent.org.cometd.script._callback79 & message=%5B%7B%22channel%22%3A%22%2Fmeta%2Fconnect%22%2C%22connectionType%22%3A%22callback-polling%22%2C%22id%22%3A80%2C%22 clientId%22%3A%22sir4xctmetaqi52dtk%22%7D%5D&1340098082636
  • 7. 应用 •基于Jetty – Google App Engine – Taobao webIM – Sina WeiboIM – ...... •优点: – lightweight,mini,pluggable,nature async •Anti-jetty – Grails内置server被转成tomcat – JBoss通信web容器被替换成tomcat
  • 8. 实现 •svn地址:https://svn.ws.netease.com/microblog/products/butter- svn 地址:https://svn.ws.netease.com/microblog/products/butter- svn地址: microblog/branches/websocket-comet •代码websocket-comet/src/test 代码 代码websocket-comet/src/test – 执行com.netease.samples.jetty.handler.HttpServletServer 执行com.netease.samples.jetty.handler.HttpServletServer Jetty •Jetty Continuation long polling – http://127.0.0.1:8080/testhtml/poll.html Jetty •Jetty Continuation streaming – http://127.0.0.1:8080/testhtml/stream.html •Servlet3 Stream Servlet3 – http://127.0.0.1:8080/testhtml/stream2.html WebSocket •WebSocket – http://127.0.0.1:8080/testhtml/websocket.html
  • 9. 实现 效果图 •效果图 long •long polling http://127.0.0.1:8080 •http://127.0.0.1:8080 /testhtml/poll.html
  • 10. 效果图 •效果图 实现 streaming •streaming http://127.0.0.1:8080/testhtml/stream.html
  • 11. 效果图 •效果图 实现 WebSocket •WebSocket http://127.0.0.1:8080/testhtml/websocket.html
  • 12. 实现 Jetty •Jetty Continuation Long polling/Streaming – 实现类:ScheduleContinuationServlet/ScheduleContinuationStreamServlet 实现类:ScheduleContinuationServlet/ScheduleContinuationStreamServlet – 典型代码: • Continuation continuation = ContinuationSupport.getContinuation(request); • continuation.suspend(); • continuation.resume(); Servlet3 •Servlet3 Streaming – 实现类:Schedule3StreamServlet 实现类:Schedule3StreamServlet – 典型代码: • AsyncContext asyncContext = request.startAsync(); • asyncContext .getResponse().getWriter().write(); WebSocket •WebSocket – 实现类:WebSocketLogServlet 实现类:WebSocketLogServlet – 典型代码: • 实现WebSocketServlet抽象类 实现WebSocketServlet WebSocketServlet抽象类 • 实现WebSocket接口 实现WebSocket WebSocket接口
  • 13. 实现 Jetty •Jetty Continuation / AsyncServlet Pattern – Suspend Resume Pattern: Pattern: • Continuation : – Continuation continuation = ContinuationSupport.getContinuation(request); – continuation.suspend();/write() – continuation.resume(); • AsyncServlet : – AsyncContext asyncContext = request.startAsync();/write() – asyncContext .dispatch();
  • 14. 实现 Jetty •Jetty Continuation / AsyncServlet Pattern – Suspend Continue Pattern: Pattern: • Continuation : – Continuation continuation = ContinuationSupport.getContinuation(request); – continuation.suspend(); – write(), continuation.complete(); • AsyncServlet : – AsyncContext asyncContext = request.startAsync(); – write(), asyncContext .complete();
  • 17. HttpServlet.service(ServletRequest req, ServletResponse res) 实现-Async流程 IDLE h an d lin g( ) su sp en d( ) / Dispatched Async Started resu m e( ) /d isp at c h( ) startAsync( ) su sp en d( ) / Completing startAsync( ) Async Wait R e-Dispatching tim eout U n-Completed R e-Dispatch Completed R e-Despatched
  • 18. 实现-浏览器 实现- • 每个页面一个连接 • 多个页面共享一个链接 – 轮询cookie – flash share object – html5 localStore
  • 19. 集群(WebSocket) 浏览器窗口 浏览器窗口 HAProxy Jetty集群 Jetty Jetty Jetty
  • 20. 集群(WebSocket) 集群(WebSocket) • HAProxy特性 – 支持4层到7层协议(nginx支持7层),支持MySQL 负载均衡 – 负载均衡算法 • roundrobin(static-rr) • ip hash • uri hash • least connection • url_param hash • head["name"] hash • cookie["name] hash • 引入原因 – url_hash – session 保持 – 通过配置,支持WebSocket协议
  • 21. 集群(WebSocket) 集群(WebSocket) •环境 –hardware: –linux version: –java version: •测试 – HAProxy(1) + Jetty(1) – 连接数:10w – 共2个客户端,每5w个WebSocket连接
  • 24. 服务器优化 • JVM – -XX:+UseParallelGC – -XX:+UseParallelOldGC – -Xms2G – -Xmx8G – -XX:NewRatio=1 – -XX:PermSize=64m – -XX:MaxPermSize=512m • 代码 – google guava cache
  • 25. 服务器优化 • Linux – TCP(client) • Caused by: java.net.BindException: Cannot assign requested address • at sun.nio.ch.Net.connect(Native Method) • at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:500) • at org.eclipse.jetty.websocket.WebSocketClient.open(WebSocketClient.java:346) • at org.eclipse.jetty.websocket.WebSocketClient.open(WebSocketClient.java:305) – 文件句柄(server) TCP(Server) #vi /etc/sysctl.conf net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 #sysctl -p
  • 26. Q/A