Realtime web application with java

7,040 views

Published on

JCO 2011에서 발표한 슬라이드

Realtime web application with java

  1. 1. RealtimeWeb Application withJava ArawnOutsiderin봄싹 2011.6.19
  2. 2. RealTimeWeb
  3. 3. ServerPush
  4. 4. 리얼타임웹에 대해서얼마나 알고계십니까?
  5. 5. http://springsprout.org:10000/
  6. 6. Client-side Server-side
  7. 7. 일단.... Client-side
  8. 8. 현재 (어쩌면약간과거)
  9. 9. Polling
  10. 10. 브라우저 서버
  11. 11. 요청브라우저 서버
  12. 12. 요청 응답브라우저 서버
  13. 13. 요청 응답 이벤트브라우저 서버
  14. 14. 요청 응답주기 이벤트브라우저 서버
  15. 15. 요청 응답주기 이벤트 요청브라우저 서버
  16. 16. 요청 응답주기 이벤트 요청 응답브라우저 서버
  17. 17. 사실... 서버푸시라고 하기는어렵습니다.
  18. 18. Comet WebSocket
  19. 19. Comet
  20. 20. Ajax처럼 특정기술이 아닌패턴
  21. 21. LongLived HTTP Connection
  22. 22. Long Polling
  23. 23. 브라우저 서버
  24. 24. 요청브라우저 서버
  25. 25. 요청 대기브라우저 서버
  26. 26. 요청 대기 이벤트브라우저 서버
  27. 27. 요청 대기 응답 이벤트브라우저 서버
  28. 28. 요청 대기 응답 이벤트 요청브라우저 서버
  29. 29. JSONP Polling
  30. 30. JSONP== JSONwithpadding
  31. 31. 스크립트태그로호출scriptsrc=”http://domain.com/?callback=process”/script서버에서콜백함수로JSON객체리턴 process({ “key”:“value”, “key2”:“value2” });
  32. 32. 동일출처정책 SameOriginPolicy
  33. 33. 도메인당 커넥션2개제한
  34. 34. Streaming
  35. 35. 브라우저 서버
  36. 36. 요청브라우저 서버
  37. 37. 요청 대기브라우저 서버
  38. 38. 요청 대기 이벤트브라우저 서버
  39. 39. 요청 대기 이벤트 응답(Chunked)브라우저 서버
  40. 40. 요청 대기 이벤트 응답(Chunked) 이벤트브라우저 서버
  41. 41. 요청 대기 이벤트 응답(Chunked) 응답(Chunked) 이벤트브라우저 서버
  42. 42. varxhr=newXMLHttpRequest();xhr.oepn(GET,/comet,true);xhr.onreadystatechange=function(){if(xhr.readyState==3xhr.status==200){//xhr.responseText}}
  43. 43. Chunked???
  44. 44. IE는지원하지않습니다
  45. 45. Foreveriframe (Hiddeniframe)
  46. 46. 웹페이지 서버
  47. 47. 웹페이지 hiddeniframe 서버
  48. 48. 웹페이지 요청 hiddeniframe 서버
  49. 49. 웹페이지 요청 hiddeniframe ChunkedData 서버
  50. 50. 웹페이지 요청 hiddeniframe ChunkedData script데이터/script 서버
  51. 51. 클릭소리 로딩바문제
  52. 52. ActiveXObject(“htmlfile”)
  53. 53. WebSocket
  54. 54. HTML5 W3C/IETF표준 WebSocket프로토콜사용 진정한양방향통신
  55. 55. HTTP를 업그래이드해서 웹소켓프로토콜을 연결한다
  56. 56. HTTP호환handshake80/443으로동작Proxy/firewall에친화적ws://와wss://사용
  57. 57. //요청 GET/demoHTTP/1.1 Upgrade:WebSocket Connection:Upgrade Host:example.com Origin:http://example.com Websocket-Protocol:sample //응답 HTTP/1.1101WebSocketProtocolHandshake Upgrade:Websocket Connection:Upgrade Websocket-Origin:http://example.com WebSocket-Location:ws://example.com/demo WebSocket-Protocol:sample
  58. 58. varws= newWebSocket(ws://domain.com); ws.onOpen= function(e){console.log(opened);} ws.onRead= function(e){console.log(e.data);} ws.onClose= function(e){console.log(closed);} ws.send(HelloWorld);
  59. 59. Adobe Flash Socket
  60. 60. Server-side
  61. 61. 지속적인연결! (persistentconnection)
  62. 62. Thread per Request
  63. 63. ThreadperRequest ServletContainer Request Thread ServletPool Request Servlet Thread Servlet Request Servlet Thread Servlet .... Request Thread
  64. 64. Servlet Container Comet지원
  65. 65. Resin (3.1+)
  66. 66. CometServletpublicinterface CometServletextendsServlet{booleanservice(ServletRequest,ServletResponse,CometController)throwsServletException,IOException;booleanresume(ServletRequest,ServletResponse,CometController)throwsServletException,IOException;}
  67. 67. ResinComet SampleCode
  68. 68. ResinCometServlet처리흐름 Job Client CometServlet Executor service(cometCtrl) execute(cometCtrl) suspend cometCtrl.wake() resume resume(cometCtrl)
  69. 69. Jetty (3.0+)
  70. 70. Continuation publicinterface Continuation{ publicbooleansuspend(longtimeout); publicvoidresume(); ... }
  71. 71. Tomcat (6.0+)
  72. 72. CometProcessor publicinterface CometProcessor extendsServlet{ publicvoidevent(CometEvent) throwsIOException, ServletException; }
  73. 73. Servlet3.0 (JSR315)
  74. 74. servletservlet-nameAsyncMessageListenServlet/servlet-nameservlet-class.../servlet-classasync-supportedtrue/async-supported/servletservlet-mappingservlet-nameAsyncMessageListenServlet/servlet-nameurl-pattern/messageListen/url-pattern/servlet-mapping
  75. 75. interface HttpServletRequest extendsServletRequest{ AsyncContextstartAsync(); AsyncContextstartAsync( ServletRequest,ServletResponse); }
  76. 76. publicinterface AsyncContext{ publicServletRequestgetRequest(); publicServletResponsegetResponse(); }
  77. 77. Servlet3.0 Sample Code
  78. 78. AsynchronousServlet처리흐름 Job Client AsyncServlet Executor request.startAsync() execute(asyncContext) asyncContext.complete()
  79. 79. WebSocket Server
  80. 80. -jWebSocket(http://jwebsocket.org/)-Netty(http://www.jboss.org/netty)-Grizzly(http://grizzly.java.net/)
  81. 81. 추상화
  82. 82. Clientside WebBrowser InternetExplorer/FireFox/Chrome/Safari... CometClient LongPolling/Streaming(XMLHttpRequest,foreveriframe)/WebSocket Serverside CometServer
  83. 83. Comet Library
  84. 84. Lightstreamer scalableandreliableServerfor pushinglivedatatoRich InternetApplications
  85. 85. Socket.IO J2EEServletbasedSocket.IO serverimplementation.
  86. 86. Project Atmosphere aportableAjaxPush/Comet andWebSocketFramework
  87. 87. Streamhub HTTPCometand ReverseAjaxserver
  88. 88. Server Long Hidden Web Flash Push polling iframe Socket SocketLightstreamer O O O O O Socket.IO O O X O OAtmosphere O O O O X Streamhub O O O O O
  89. 89. Streamhub - QXQuiz CodeReview https://github.com /spring-sprout /jco-2011-realtime
  90. 90. Thread vs Evented
  91. 91. Questions...?Arawnarawn.kr@gmail.comhttp://arawn.tistory.comOutsideroutsideris@gmail.comhttp://blog.outsider.ne.kr
  92. 92.

×