大家好。这个是我的 "Real Time Web" 这个 talk 的 slide http://www.slideshare.net/sishen/real-time-web-15229483
可能得等视频出来后配合这个看比较好,有兴趣的同学可以先看看,有什么想交流的可以联系我,:)
#1 楼 @Tony612 还真不知道 slideshare 被墙了... https://speakerdeck.com/sishen/real-time-web
如果不在乎浏览器支持的话,websocket 之外,还可以选择 server send event + 普通 ajax 的手段。 不过目前来讲,对 websocket 封装的库会多一点,也热门一些。
这个主题的演讲非常棒,讲解很清晰流畅,本来对这个主题了解不多,兴趣也不大(因为觉得难度比较大),听完之后一下子逆转了,我们也有一个实时的需求,实时的在线客服,现在是使用第三方的服务,现在感觉可以自己做。
#12 楼 @edokeh 应该是 Bayuxe
Bayuxe, 最初是看CometD这个项目了解的。
这个协议基于 HTTP 协议,目标 Web Realtime, 传输数据格式为 json.
Ruby 中可以用 (Faye)http://faye.jcoglan.com/
各人认为比较适合做 web 论坛通知,审核通知,Web 短信消息通知等。
XMPP, 基于 xml 数据格式,主要面向 IM 领域. 如果应用想支持Pidgin这类软件,可以考虑使用 XMPP 使用的时候需要 (Openfire)http://www.igniterealtime.org/projects/openfire/之类的独立服务器。
个人理解。
#12 楼 @edokeh 看你应用的具体需求。用 BOSH (XMPP) 的好处在于标准化,可扩展性非常高,已经有非常多的扩展可以用了,比如 IM, Chat Room, Pubsub, File Sharing, etc. Google Wave 就是基于 XMPP 做他的实时方案的。他的缺点也是标准化,你需要先了解 XMPP 才能用得好这个东西。可以用 Jabber Client 是一个优点,但不支持也没有任何的关系(你不需要暴露出用户在 XMPP 服务器上的账号信息)。Bayeux 在我看来是一个很小的协议,他把很多事情都留给应用端了,也就是说你需要自己去定义数据格式等,可以做的非常随意,在后期可能会带来维护上的问题。但是,在上手上会比 使用 BOSH 更快。这两个在 Long Polling 的实现技术上没有孰优孰劣,最终还是看你的应用的具体需求。
PS:个人偏好 BOSH。
#15 楼 同时,我希望未来 WebSocket + XMPP 的组合,有兴趣的可以看看 http://tools.ietf.org/html/draft-moffitt-xmpp-over-websocket-01
#8 楼 @kenshin716 SSE 是使用 http streaming 的,也是不错的选择,单向的服务端推送对很多应用也够了,就像你说的也可以用 SSE + Ajax 来做双向,但是,这样子的话,不如直接上 WebSocket。
#15 楼 @yedingding 了解,感谢 之前做一个 webim 的项目,由于工期紧,在这上面没有仔细考虑,直接用了基于 Bayeux 的 Cometd,现在考虑客户端,发现 XMPP 似乎优势更大一点,所以纠结啊,呵呵
@lvjian700 我特地查了下,发现我们俩都写错了,是 Bayeux ... 我只能说这破词真心难记啊。。。
这个是不是就是指 Faye 这类的?我看 ruby-china 就是用的这个吧,然后我用了 ryan 的private_pub,我觉得这个做聊天的比较好,我是做类似 ruby-china 的论坛的通知,就感觉不太舒服,也可能是我的实现方式比较不好。而且这个是要 production 环境才有用的,开发不是很方便,要来回切换。。
@yedingding 你好。你的演讲很不错啊!本来当时想问你个问题的,不过没机会了。 我们现在有个项目是关于足球信息推送的。要求很即时的把信息推送给 web 客户端(网页),这是核心功能。并且对 IE 系要有一定程度的支持。原先的 Pusher 因为是 WebSocket,在 IE 是彻底不能用(而且也有些网络原因),我们现在正在用 Faye,就是不知道对 IE 支持怎么样(因为我们现在都直接告诉客户,建议用 Chrome 的)。 请问如果考虑对 IE 的支持的话,是不是就不能用 Faye 了?那用什么技术比较好呢?Long polling 吗?
#32 楼 @darkbaby123 Pusher 是有 Flash Fallback 的,也就是在有 WebSocket 支持的情况下,用 WebSocket,但是没有的话,就退化成 Flash Socket。你有没有尝试过?文档在这里,http://pusher.com/docs/flash_fallback 在选择实时方案时,从浏览器兼容角度来看,一般都会提供 fallback.
#32 楼 @darkbaby123 关于网络问题的话,的确国内访问 Pusher 速度并不是非常快,你负载大概在多少,可以尝试下 slanger 这个 gem。Faye 也是有 fallback 机制的,支持 IE,在支持 WebSocket 的情况下也可以直接用 WebSocket 作为 transport。用这些的好处在于服务端的开发量少,基本是内部通讯协议的定义。
@bhuztez 好的,我去研究下。谢谢提供资料! @yedingding 我们没用 Flash,主要是都不熟。。。目前已经没使用 Pusher 了,全面用 Faye 替代。因为原来有几次客户端没有及时收到数据,但连接我们的网站并不卡,后来 ping 了发现 Pusher 服务器在欧洲(忘了是美国还是欧洲了),而我们的客户主要是在亚洲,速度不大稳定,国内也有,Pusher 也有时候被 HX 了。。。所以才决定自己用 Faye 搞推送服务器的。换了 Faye 之后稳定性大幅提升了,两个月没管都没出问题。。。
#38 楼 @darkbaby123 cool,很好的案例。Faye 对 IM 应该支持的,你去实验一下。htmlfile 不适合你,走 http streaming,还要你自己去开发服务端,已经是很老的东西了。
@yedingding Thanks! 说起来不好意思,我自己都没试过 IE 下的兼容性。听你演讲才知道你们也在用这个,问问你算是偷个小懒。Pusher 的 FlashSocket 和 htmlfile 有空闲时间我再去看看,算是扩充点知识面了。
#39 楼 @yedingding htmlfile 是不需要 Flash 就能支持到 IE5.5 的方案
Orbited 里代码早就有了... https://bitbucket.org/desmaj/orbited/src/tip/daemon/orbited/transports
faye 是支持 ie 的,只是在 ie6 里面有一点点问题。需要修改 gem 里的一段代码,你到 github 去看下,有人提交了解决方案,我也是改了的才成功.
还有别用那个 private_pub, 我后来又重新去掉改写程序,那个 gem 对 ie6 有很多问题.
现在有个问题,faye 下面用 thin 服务器,我在 linux 下运行聊天室,1-2 天 thin 需要重启,我不得不写个 shell 脚本
DTTERM = ps -ef|grep thin | grep -v "grep"|wc -l
if [ $DTTERM -n 0 ]; then
cd /opt/nginx/html/project;
rackup faye.ru -s thin -E production;
fi
用 linux 里面的 cron 程序定时去执行这个脚步,每隔 5 分钟监测一次,如果 thin 停止好重启。几个月了.我一直没去理。到现在也没找到 bug, thin 在 linux 的 log 在哪里啊?
faye 做聊天室还有个问题,上线好解决,下线的状态不准确. if faye_action == "subscribe" push_client(faye_msg.person_id,faye_msg.person_nick_name) elsif faye_action == "disconnect" pop_client(faye_msg.person_id) end 你在浏览器里面关掉页面,打开页面,不断的重复这个动作。消息 disconnect 就不正常了。我把 faye 的运行日志打印到命令行里面看到反正多几次这个状态就不正确了。导致有的人下线了还显示在线. DHH 写的项目 Campfire 不知道大家用过没,下线是需要自己点击 leave room 的。我到现在还没知道个好的自动下线的方案。如果有谁用 faye 写过聊天室项目,请告诉我。不知道我是不是漏掉了什么函数没去看. faye 项目官方说不主张用这个做聊天室,说做通知最好。 我觉得 faye 使用简单,也不想跨入 node.js,想用 faye 做下去. 请教 yedingding, 在 ruby 领域里面,除了用 faye 实现聊天室,还有什么别的方案吗?这些都用 faye 做合适吗?我是打算 faye 到底了. 我怕最后性能有问题。有人在国外论坛上说过 thin 的问题。能改 faye 的服务器吗
那样也可以,就是需要定时去监测一下。看客户端有没有发请求.列入,发了消息,我就延迟一下 timeout 的时间。我现在是客户主动关闭标签页,通过 faye 发送 unsubscribe 来下线用户,但是 faye 这方面有点问题。关闭打开,关闭打开,反复几次就不正常了。然后再关闭就忽然没发 unsubscribe 消息了。导致用户没下线 现在我去下 ppt 看看 bosh+ejabberd/openfile
#53 楼 @tank 你是说我做的 live show 吗?不是的,不过我打算跟 @poshboytl 重做时看看能不能搞个系列的,各种技术都尝试一下。
#55 楼 @yedingding 关闭标签的时候 faye 有时候没发送 disconnect 消息过来。有时候发.我是通过这种方式来把一个用户下线的,所以不准确. if faye_action == "disconnect" pop_client(faye_msg.person_id)
#56 楼 @tank 暂时没有,以后可能会有。聊天部分是 HipChat (http://hipchat.com).
关闭标签的时候客户端做了啥,服务端做了啥,你自己的代码部分。
#60 楼 @yedingding Long polling 服务器端开发应该跟 Streaming 差不多吧?都是要保持和管理长连接嘛,有哪些不一样的地方嘛?
#62 楼 @edokeh streaming 的连接理论上是无限长的,需要保持很多状态信息,而 long polling 相对只是保持一定时间的连接,很大程度可以依赖于请求带过来的信息。所以在开发上 streaming 需要处理更加的小心,包括心跳重连等,我说的难度是相对的,是说比起来。双向和单向两个没有区别,都是模拟的双向,也就是一开始建立连接后,只能从服务端给客户端发数据,而客户端要向服务端发数据,必须得另开一个连接。用 Streaming 还是 Long Polling 我觉得还是使用场景,在我看来更新非常频繁的比如 Twitter,是不大适合用 Long Polling 的,因为负载太大,而且延时严重