在Rails app中的Plezi路线

时间:2015-11-19 17:29:46

标签: ruby-on-rails websocket

我已将plezi添加到Gemfile中并创建了这样的初始化程序:

#config/initializer/plezi.rb
class NewsPublisher
  def on_open
    binding.pry
  end
end

route '/ws', NewsPublisher

当我尝试通过JS使用此代码new WebSocket("ws://127.0.0.1:3000/ws");连接它时,我在客户端收到以下错误消息:Error during WebSocket handshake: Unexpected response code: 404

在服务器端,我有:ActionController::RoutingError (No route matches [GET] "/ws"):

有人可以解释如何在Rails app中使用plezi路由吗?

1 个答案:

答案 0 :(得分:0)

在Plezi的getting started guide中,它指出:

  

如果您的控制器类定义了on_message(数据)回调,则plezi将自动为该路由启用websocket连接。

这个陈述应该可以在websockets和Rails指南中重复......但是我还在编写文档而且还不完整。

要确保Plezi为'/ws'路由启用websockets,请添加on_message回调(即使是空回调)。即:

#config/initializer/plezi.rb
class NewsPublisher
  def on_open
    binding.pry
  end
  def on_message data
    puts "Websocket got: #{data}"
  end
end

Plezi.route '/ws', NewsPublisher

如果您有任何问题,请告诉我。

编辑(从评论中添加更多信息)

Plezi使用Iodine作为服务器,绕过Rack的hijack API(Iodine是Ruby的快速C扩展,它充当Rack服务器,支持本机websockets)。

在Plezi的guide to Plezi with Rails/Sinatra/Rack中,有人指出,在Rails / Sinatra / Rack中使用Plezi时:

  

只有一个问题 - 每个应用程序不能只有一个Web服务器。这意味着我们现有的Rack应用程序必须使用Plezi(实际上是Iodine)作为它的Web服务器

确保从Gemfile中删除任何服务器(例如thinpumaunicorn等等。)

Apache(或Nginx)和Passenger怎么样?

Apache可以将请求转发给Iodine,就像代理服务器一样,类似于Apache与puma,passenger,unicorn,thin和其他应用服务器一起工作的方式。

可以使用Apache或Nginx,但乘客。

性能

测试并查看。

Iodine是一个C扩展,它使用epollkqueue系统调用 - 这些调用非常快并且是为了并发而构建的。此外,Iod​​ine有一个非常好的内存管理设计,其中传递给“Ruby-land”的Ruby对象通常被回收或清除以允许优化的性能......但这只是单词。只有一种方法可以知道 - 测试。