python realtime

理论知识

尝试解决服务器推送的问题, web都是拉取数据:浏览器发出请求到服务器,服务器会产生并且发送回响应 但是,如果有需要将数据主动从服务器推送到浏览器该怎么办呢?

长轮询long-polling

解决的方法:浏览器发出ajax请求到服务器,要求更新,但是这个常用的浏览器和服务器之间的推送方法,有一个问题: 如果服务器没有什么要发送,它会保持连接打开,直到为用户提供一些数据,客户端收到响应后,会发出另外的一个请求,获得更多的数据 上面的这种技术被称为long-polling,长轮询
显然,这种方法不太高效,大多数情况下,信噪比是非常高的(无用的数据比有用的数据),因为这样更多的时间将花在处理http请求(比如解析和验证报头),而不是实际数据发送到客户端 不幸的是,这种长轮询的方法是目前将数据推送到客户端最适合的方式
基于HTTP/1.1情况好转了一点,TCP连接可以使用 Keep-Alive头,默认情况下, 连接在请求发起后将保持打开状态。 此功能使长轮询延迟得到了降低,这样就没有必要为每个轮询请求重新打开TCP连接 HTTP/1.1还引入了 块传输协议 。 它允许讲响应分解为成更小的数据块, 并将它们立即发送到客户端,而不是一直等到完成HTTP请求 不幸的是,有些不兼容这个功能的代理服务器还是试图在转发之前缓存整个响应,所以客户端将不会收到任何数据,直到代理认为http请求已经完成 虽然看起来,web还是能正常工作-因为客户端最终还是会得到来自服务器的响应,但是它打破了为实时而设计的块传输协议的整体思路

其他方法

2006年9月,opera为它的浏览器实现了试验性的服务事件发送功能,虽然sse和块传输协议很相似,但是还是不同的协议,而且有更好的客户端api 2009年4月23日,SSE得到WHATWG批准,得到几乎所有的现代的桌面浏览器(Internet Explorer的除外)的支持 还有其他的技术,比如 forever-iframe, 这是两种可以为Internet Explorer版本低于8做跨域推送的技术之一(另一个是 jsonp, 以及 HTMLFILE 等 总之,所有这些基于HTTP的折中方案都可以叫做 Comet

方法利弊

long-polling,长轮询是昂贵的,但是兼容性很好 块传输协议效率更高,但有可能不是所有的客户端都能正常工作,并且如果没有某种形式的探测都无法发现问题的存在 sse也不错,但不是所有的浏览器都支持,比较好的是有办法在建立连接前,就知道它是否支持
这些方法都有一个问题,它们都只提供一种方式将数据从服务器推送到客户端,而不是建立双向通信,客户端每次想发送一些数据的时候,将不得不使用ajax请求到服务器,这样会增加延迟,并且服务器也会产生额外的负载

邂逅websockets

虽然websockets不是什么新技术,但是经历了几个不兼容的迭代后该规范终于通过了,rfc编号rfc-6455 简而言之,基于websocket的服务器和客户端之间建立的是基于tcp的双向连接,连接的建立使用兼容http的握手协议,加上额外的websocket相关的头,并具有额外的协议层次划分,所以它不仅仅是一个从浏览器中打开原始的tcp连接
websocket协议的最大问题是:浏览器的支持,防火墙,代理服务器和防病毒应用的支持,企业防火墙和代理服务器通常因各种原因阻止的WebSocket连接。 有些代理服务器不能处理WebSocket在端口80上连接 - 他们认为这是一般的HTTP请求,并尝试缓存它。 有HTTP扫描组件的杀毒软件也不允许WebSocket连接 无论如何,websocket来建立的客户端和服务器之间的双向通信是最好的方式,但是不能单一的用来解决推送问题

用例

如果您的应用程序大多是从服务器推送数据,基于HTTP的传输会工作得很好。 但是,如果浏览器支持WebSocket的传输并且WebSocket的连接是可以建立的,它将是更好的选择 总而言之, 最好的办法是:尝试打开的WebSocket连接, 如果失败 - 尝试回退到基于HTTP传输。 当然也有可以”升级”连接 - 首先使用长轮询(long-polling), 然后尝试建立WebSocket的连接。 如果成功,就切换到WebSocket的连接。 虽然这种做法可能会降低初始连接的时间, 需要注意服务器端实现, 以避免但在两者连接之间切换时发生任何的跳变情况(race conditions)

polyfill库

为所有已知的浏览器提供变通方案,搞定代理和防火墙的问题,尤其是从头开始处理这些问题,是非常困难的,幸运的是,已经有人提出尽可能稳定的解决方案 有一些 polyfill库,像sockjs 库 , socket.io 库 , faye和其他一些框架,实现了基于各种不同的传输实现上的类WebSocket的 API 虽然他们所提供的服务器和客户端API不尽相同,但他们有着共同的理念: 在给定的情况下用最好的传输方案,并且提供一致的服务器端API 例如,如果浏览器支持WebSocket协议,polyfill将尝试建立WebSocket连接。 如果失败了,他们将下降回到下一个最好的传输协议。 Engine.IO使用稍微不同的方法 - 他先建立长轮询连接(long-polling),并尝试在后台升级到WebSocket 在任何情况下 - 这些库将尝试建立双向连接到服务器上使用最可靠的传输。 不幸的是,在使用Socket.IO 0.8.x的时候有较差的体验。 我一般在我自己的项目中使用 sockjs-tornado, 即使我自己写了 TornadIO2。 Socket.IO早期的server实现是基于 Tornado]的

服务器端

基于wsgi的服务器不能被用于创建实时应用, 因为wsgi协议是同步的,wsgi服务器一次只能处理一个请求

回顾长轮询long-polling传输
客户端打开http连接到服务器,获得更多的数据

无可用的数据,服务器保持连接打开并等待数据发送

因为服务器无法处理任何其他请求,一切都将被阻塞

伪代码表示:
def handle_request(request):
    data = get_more_data(request)
    return send_response(data)

如果get_more_data阻塞了,那整个服务器就会被阻塞,不能处理请求了
当然,可以每个请求创建线程,但这非常低效。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 初涉IM,首先我有这么几个问题需要弄明白: Socket 和 WebSocket 有哪些区别和联系? WebSoc...
    夜幕青雨阅读 11,109评论 8 39
  • WebSocket简介 谈到Web实时推送,就不得不说WebSocket。在WebSocket出现之前,很多网站为...
    吧啦啦小汤圆阅读 8,139评论 15 75
  • 那一天 你轻轻地一声呼唤 拨动了我心中最柔软的那根弦 从此夜夜 你成了我心底的一首歌 当月光漫过月季飘香的窗前 当...
    伊清欢阅读 271评论 7 6
  • 妈,后半夜,你入我梦。 还是染青的大襟布衫,黑色的裤子。头发不乱,慈慈地看着我。 “妈,你……”突然间看到你,我有...
    八里山人程远河阅读 710评论 23 27