How to push data to a browser?
chenchao01@baidu.com
Polling Vs
Push
HTTP functions as a request-response protocol
How to push?
• Comet
– Long Polling/HTTP Streaming/Ajax Push/Reverse
Ajax, Two-way-web/HTTP serverpush
• Flash XMLSocket
• Java/Silverlight socket
• HTML5 Server-Sent Events
• HTML5 WebSockets
Two kinds of Comet
• Streming
• Long Polling
Comet - Streaming
Comet - Long Polling
Design & Architecture
Comet is a
pub/sub System
rely on http & web
产品功能上分
• User-centric
– Event based
– Web chat/notification/gmail
• Data-centric
– Data synchronization
Architecture model
• Symmetric pub/sub
– User-centric
• Asymmetric pub/sub
– Data-centric
Symmetric pub/sub
eg: Tornado + RabbitMQ 快速实现一个很好可扩展的 webchat
Asymmetric pub/sub
Data Feed ~= Adapter
Eg: Facebook’s webchat
Facebook’s webchat
The two Models
• 互相模拟对方的行为
• Mix the two model
How to Implement a Comet
Server?
Next
Lots of Connections
• How many connections to handle?
– 同时在线用户数
• C10k(http://www.kegel.com/c10k.html)
• Asynchronous IO
Communication
• Browser & server
– http
– JavaScript
key ingredients
• Asynchronous IO
• Message Dispatch
• HTTP
• Javascript
开源
• Tornado
• Twisted
• Jeety
• nginx_http_push_module
• Bayeaux 协议 ( 该协议对应有服务器端以及
js 的实现 )
• …
Scale
空间 comet system overview
backends
• Lighttpd
– Mod_pack(hold 链接,处理 long polling)
– Mod_proxy_backend_pack( 与 control-center 交互, macpack)
• Control-center
– 类似于 ui ,接受 lighty 的请求向 register 注册,接受 message_pool
的请求,向 lighty 推送
• Register
– 单点,维护 uid 和 ip 的映射关系
• Message_pool
– 接受来自 transfer 的数据,存储数据库,然后推向 control-
center )
Message send
Q&A

How to push data to a browser

Editor's Notes

  • #4 Html5 浏览器是否支持html5标准,server-sent event实际上就是comet在html5中的标准化,增加了text/event-stream类型。 Websocket实际上是双向通信的,在tcp协议之上。 flash,java,sliverlight需要插件 flash,java,sliverlight,websockets都是建立新的tcp链接 Comet实际上是老技术的一个新名字而已 Comet的一些资料 http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ
  • #6 在出现异常时connection close。 当服务器端正在发送时,客户端重连 ,可能会出现丢消息(引入ack机制的话,成倍的增加了开发设计成本) 浏览器会出现正在加载(貌似ie6已经解决,google提出的一种方法)
  • #7 在空间的comet系统中,默认60s。
  • #10 User-centric就是目前sns,gmail,web chat这样的应用。交互性较强。 Data-centric主要是数据同步,比如说在页面上某一块显示了股票数据,会实时更新
  • #11 实际上这里symmetric/asymmetric并不和user-centric/data-centric这么严格对应,只是由功能到架构的一个直接推导。 下面几页分别介绍基于这两种模型来开发webchat
  • #12 Symmetric pub/sub,主要是数据提供,和数据推送都经过comet server(不见得就是一个模块) 这种结构相对简单,尤其是对应在起步阶段,开发容易。 最简单的模式是,comet logic和业务逻辑放到一个模块,部署到一台机器。这样的开发成本非常低。 但是扩展性是个问题,如何扩展在后面介绍。
  • #13 数据提供方在comet server系统之外。很多实用data feed前面可能还会有adapter,或者datafeed 本身就是adapter 有些时候data feed是一个adapter Facebook’s webchat实际上是融合asymmetric和symmetric Facebook’s webchat诞生于 一次backathon(Jan 07),Erlang开发,一台服务器 重构: 4 engineers,0.5designer, (07年mid-fall,首先是基础设置的开发和改进,08年2月提测,08.4.6接更新,08.4.23全流量)
  • #14 09年四月 2亿活跃用户,8亿+messages/day, 7million active chaanels at peak,100+channel machines, 通过thrift来交互。 Web tier(php) Chatlogger(c++):存储对话 Presence(c++):聚合在线信息在内存中 Channel clusters(erlang):消息分发.one channel per user,long poll,mochiweb 猜测Channel clusters的实现应该是类似于一个mq
  • #15 Asymmetric和symmtric这两种模型其实都可以互相模拟对方,并且在实际使用中也会是混合在一起使用。 这两种模型是对架构模型的一个拆分归类。
  • #17 每个时刻都会有很多 idle connection。需要有一个异步机制维护这么多的并发的connection。
  • #19 开发一个comet server实际上主要需要考虑的就是这四点。 Message Dispatch实际是对应于前面架构模型提到的两种模型。同时这一块也是comet系统跟原有系统结合的关键点。另外,整个comet系统的可扩展性很大程度上也依赖于这一块。
  • #20 Bayeaux:http://svn.cometd.com/trunk/bayeux/bayeux.html#toc_0 Bayeaux是一个comet的协议,目前还不是rfc文档。类似于xmpp,是一个开放协议。 所有符合bayeaux协议的client和server都可以相互交互,数据使用json格式。 Bayeaux基于client publishing和subscribing to channels。 Bayeaux的comet server是没有任何逻辑的。 一个开源的服务器端cometd(http://cometd.com)
  • #21 Pub/sub cloud 可以就是一个mq(rabbitmq)。
  • #23 Lighttpd对应于comet logic control-center + register + message_pool构成了一个pub/sub + message dispatch,业务逻辑也糅合在了这里面。