网页端收消息,究竟是推还是拉?( 二 )


场景三,新消息来时,正好有通知连接在,则:

  • 新消息来时,正好有通知连接在
  • 通知连接实时将消息带回
  • 立马再发起通知连接
 
上面三个场景的最终状态,都是“一定,永远,会有一条通知连接,连接在浏览器与服务器之间”,这样就能够保证消息的实时性 。当然,有人会说,HTTP的返回与再次发起会有一个时间差,如果这个时间差,恰巧有新消息过来呢?
网页端收消息,究竟是推还是拉?

文章插图
 
场景四,新消息来时,没有通知连接,则:
  • 新消息来时,没有通知连接
  • 把新消息放入队列
 
最后这个场景,发生的概率非常小,但也确保了在“HTTP的返回与再次发起会有一个时间差”内,消息不会丢失,在通知连接发起后,消息能够实时返回 。
 
总结
网页端收消息,究竟是推还是拉?
  • 最容易想到的是拉,但实时性和效率是一对无法调和的矛盾
  • 最佳的方式是推,但WebSocket和FlashSocket各有局限性
  • 最通用的方式是长轮询,通过HTTP短连接拼装长连接,具体是通过“夯住”“只收推送通知”的“通知连接”来实现的,能够做到消息的实时性到达
 
来源公众号:架构师之路
作者:沈剑




推荐阅读