poll方式
poll方式,也称为轮询,是大家都比较熟悉的一种数据同步方式,客户端定期去ping查询服务器,确定是否有需要的数据。例如,软件更新模块,客户端软件需要定期去查询官方网站,判断当前是否有更新的版本,如果有就提醒用户进行升级。邮件客户端,需要定期查询邮件服务器,查询是否有新的邮件。RSS阅读器,也是需要不断的查询rss地址的状态,如果有更新,就将数据拿回来。
当服务器没有数据的时候,poll方式会浪费大量的带宽。 为了降低带宽,通常是采用减低poll的频率来实现的,这就导致了消息的长延迟,实时性不高。像gmail的POP3邮件检查间隔从10分钟到1小时不等。
push方式
poll的问题在于很多情况下,通信信道是单向的。为了解决poll的问题,可以将通信信道设计为双向的,这样就可以服务器采用push的方式主动向客户端进行数据同步了。双向通信信道设计,考虑到要穿透NAT和防火墙,很多实现采用长连接。例如各种IM的实现:MSN是TCP的长连接,QQ是UDP模仿的长连接,GTALK是HTTP模仿的长链接。
push方式,服务器主动向客户端推送数据。当前实现push方式有两种方法:
1. 客户端首先连接到服务器,并维持长连接
2. 服务器能够直接访问到客户端,不需要长连接
在国内NAT和firewall遍地都是的情况下,第2种方法不是很可行,但是对于一些企业应用,这种方法还是不错的,比如后面提到的pubsubhubbub。
但是push方式,通常需要长连接,对于服务器端其实也是一个不小的压力,虽然现在C10K问题得到了比较好的解决,但是对于一些大规模互联网应用来讲,用户数是数以亿计的,单单是维持TCP连接,就需要太多的服务器。因此,除了一些实时性要求比较高的应用,现在push方式使用的范围还不是很广,例如push方式在IM、服务器监控等领域都有应用。