Presentation Transcript
Zero Latency HTTPthe comet technique : Zero Latency HTTP the comet technique
And Comet is…. : And Comet is….
Comet is the
Serial Port
of
Web 2.0
Who am I – bla bla : Who am I – bla bla fhanik@apache.org
Tomcat Committer / ASF member
Co-designed the Comet implementation
Implemented NIO connector in 6
Responsible for session replication and clustering
Been involved with ASF since 2001
What we will cover : What we will cover Brief History of HTTP
How HTTP is used today
Introduction to AJAX
Beyond AJAX, The Comet Technique
Comet Implementation – Under the hood
Uni- vs. Bidirectional Comet
Problems and their solutions
Demo
Q & A
The History of HTTP : The History of HTTP 1.0 (7th release) RFC 1945 in 1996
Co-authored by ASF’s Roy T Fielding
Current RFC 2616
Lead by W3C
Activity on specs are closed
Standard has been achieved
http://www.w3.org/Protocols/History.html
What is HTTP : What is HTTP HyperText Transfer Protocol
Text based protocol
Request/Response semantics
Stateless
Most commonly run over TCP/IP networks
Protocol used for much more than just hypermedia information sharing
What is HTTP : What is HTTP Text based protocol – CRLN delimited
GET /Protocols/History.html HTTP/1.1
Host: www.w3.org
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
What is HTTP : What is HTTP Request/Response Semantics
GET /Protocols/History.html HTTP/1.1
Host: www.w3.org
Keep-Alive: 300
Connection: keep-alive
HTTP/1.x 200 OK
Date: Mon, 19 Mar 2007 15:46:17 GMT
Server: Apache/1.3.37 (Unix) PHP/4.4.5
Keep-Alive: timeout=2, max=100
Content-Length: 19575
Connection: Keep-Alive
Request Response
What is HTTP : What is HTTP Stateless
TCP session can end after each request
State based on cookies
TCP/IP transport
No limitations for transporting with other protocols
Delivers both text and binary data
HTTP Limitations : HTTP Limitations Request/Response
Change one field on a page requires a reload of the entire page
Client always has to initiate the request
Stateless
Server required to keep state
State is timed out, if client is not cancelling it
Finer grained communication is needed
AJAX
Rich Clients (FLEX, OpenLaszlo, …)
AJAX : AJAX Asynchronous JavaScript +(and) XML
Uses HTTP
Asynchronous data processing
Able to request data from server and update a page in the browser
Common examples
maps.google.com
Benefits of AJAX : Benefits of AJAX Performance
More can be accomplished in less amount of transactions
Less user interaction
Program can make intelligent decision about when a request needs to happen and what data it needs to fetch
Sample Application for view of benefits
http://www.ajaxinfo.com/ucst/index.html
Beyond AJAX : Beyond AJAX What did AJAX not accomplish?
Still client poll based
Server push can be accomplished by a client poll followed by a delayed response
Traditional web/servlet containers are thread-per-request based
Server resource tied up for the duration of the request
Introducing Comet : Introducing Comet The answer to our problems
Q: What problems?
A: The fact that port HTTP/80 has been replacing every decent TCP protocol over the years.
Q: What do you mean?
A: I’ll explain…it all boils down to port 80
Slide15 : Picture borrowed
from:
dojotoolkit.org
How it Works : 3. Register with background thread How it Works Timeline Server Client 1. HTTP request 2. BEGIN Event 5. HTTP Response - 200 OK – Tx Enc: Chunked 4. Event Complete Webapp
Async Thread 6. Server data push 7. Encode and transfer 8. Another server push 9. Client Push 10. READ Event 11. One more client push Webapp
Worker Thread 12. And on it goes…
Under the hood : Under the hood Open HTTP request, leave it open ended
Instant or delayed response(s), leave it open ended
Tomcat processes just like servlet
CometProcessor extends HttpServlet(or should)
CometFilter extends Filter
Connection remains open and is writable
Under the Hood : Under the Hood Open ended request
POST /load/echo HTTP/1.1
User-Agent: Filips Comet Client/1.0
Host: 127.0.0.1:8080
Transfer-Encoding: chunked
10
test data test 1
Open ended allows for new data without the overhead for a new request
Zero Latency HTTP
Under the Hood : Under the Hood Open ended response
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Content-Type: text/plain;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 19 Mar 2007 22:25:36 GMT
12
test data test 1
Open ended allows for new data without the overhead for a new request
Zero Latency HTTP
Under the Hood : Under the Hood CometProcessor
Extends HttpServlet to provide a fall back option should the connector not support Comet
void event(CometEvent event)…
Types of Events:
BEGIN
READ
END
ERROR
A request is a Comet request if the URL maps to a servlet that implements the CometProcessor interface
Under the Hood : Under the Hood CometFilter
Extends javax.servlet.Filter to provide fall back option should the Connector not support Comet
void doFilterEvent(CometEvent event, CometFilterChain chain) …
Same mapping rules as CometProcessor
Under the Hood : Under the Hood BEGIN
New connection created
Request headers fully parsed and mapped to a servlet
Partial body may or may not have been read
Processed by a worker thread
May proceed directly to a READ event
Under the Hood : Under the Hood READ
New data available on the connection
Processed by worker thread
Read now to avoid repeated “read” events
Read using servlet input stream event.getHttpServletRequest.getInputStream()
Under the Hood : Under the Hood END
The request has naturally come to an end
Server may shutdown, and needs to close connections
Only if Connector shutdown prior to app, piggy back on HttpServlet.destroy for most apps instead
ERROR
When the connection times out or an error has occurred during invokation
Under the Hood : Under the Hood Events are “connection” centric
Thrown based on IO events
Reading should only be done when an event is thrown
Writing can be done async
Synchronize your write methods
Gotcha’s : Gotcha’s NIO – client disconnect is signaled by a READ with a -1 or EOFException by InputStream.read()
The event lifecycle is not always what it appears to be
While the API seems simple, it is pretty fragile
Easy to break if misused
Bidirectional Comet : Bidirectional Comet Tomcat supports bidirectional comet communication
Server can push data to the client
Client can push data to the server
Timeout values can be set on a per-connection basis
Unidirectional Comet means that only the server can push data to client
Scalability? : Scalability? No more thread per connection or thread per request
One asynch thread can handle writes for thousands of Comet connections
No overhead of request/response headers for each request
No overhead for TCP setup/breakdown
Memory overhead for open connections
Examples of use : Examples of use Rich Clients
Mail
Maps
Online conferences
Clients with need for server push
Stock tickers
Auction sites
Chat
Future Improvements : Future Improvements Non blocking reads
Non blocking writes
Bayeux protocol implementation
End Request – AJAX over Comet Keepalive Connections
Comet through HTTP proxy(?)
Feedback : Feedback Tomcat Dev List
fhanik@apache.org
Help and ideas are wanted
Catch the
buzz on authorSTREAM
Copyright © 2002-2008 authorSTREAM. All rights reserved.