终于得到 DHH 批准,把他亲自演示如何在 Rails 5 中利用 Action Cable 做一个实时的聊天 app 的视频上传到了 Railscasts-china.com .
有时间在做翻译,现在大家先睹为快吧!
Enjoy!!
赞 DHH 大神,以及祝贺 RailsCasts China 终于更新了。 距离 RailsCasts China 上一次发布视频,已经两年过去了,而 RailsCasts 则两年半没有发布新视频了。 让人追忆逝去的时光~~~
有意思,Action Cable 每一个连接的处理是通过 EventMachine 进行的,而实际的工作又是通过一个 Ruby 的线程完成的。想起了那天邱华分享的从 EM 事件循环中派生 thread 的那个 API。那个 API 叫什么来着,居然忘记了 T_T @qhwa
@psvr 同求分享的内容。另外派生 thread 是为了不阻塞 EM 接收下面的请求么? 另外,视频里的思路是把 render 放到 job 里去,也是为了不阻塞 EM 么?
EM 负责处理并发请求,job 任务是通过 Celluloid
去执行的,Celluloid 本质是用线程池实现的。
@gonglexin @yukihiro_matz Phoenix 的 channel 的抽象层级更高,而且个人感觉设计得更加容易理解。
我两个都写过 demo,ActionCable 里面分了 cable server, channel, broadcasting 三个概念,其中 broadcasting 才是负责把服务端的消息发送给客户端的,并且要跟 stream_from
配合起来用。虽然这些写法是固定套路,但感觉框架层面还可以把 API 实现得更简单点。不过 ActionCable 毕竟诞生不久,总有时间变得更好。
BTW 简单地看了一下 broadcasting,Rails 是直接把消息代理给 Redis 的 pub/sub 了。所以理论上 Rails 应该是不知道有多少个 subscriber 的。这点我没证实过,如果说错了欢迎指正。想了解的可以去 edge Rails 文档里去查。
Phoenix 里面的 socket 和 channel 都是抽象概念,具体实现方式不仅限于 WebSocket,所有主流平台都有对应的客户端(Web, iOS, Android),这应该是它相比 ActionCable 最大的优势。socket/channel 对应传统的 route/controller,代码处理方式也比较一致,你可以在 socket 文件中定义针对 channel 的路由,每个 channel 的 handle_in/handle_out
方法用来处理输入输出。感兴趣的可以去看 Phoenix Channel 。
PR to enable using PG as storage 和PR to remove EventMachine合并后,Windows 下终于也可以跑这个 ActionCable Demo 了,有兴趣可以看看。
想问一下各位,今天我尝试的用在纯 API 项目里,直接报了一个错误 Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: keep-alive, HTTP_UPGRADE: )
,想请教一下,是需要配置 websocket 吗?