Rails应用程序中的Plezi路由



我在Gemfile中添加了plezi,并创建了这样的初始化器:

#config/initializer/plezi.rb
class NewsPublisher
  def on_open
    binding.pry
  end
end
route '/ws', NewsPublisher

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

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

有人能解释一下如何在Rails应用程序中使用plezi路由吗?

在Plezi的入门指南中,它指出:

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

这句话可能应该在websockets和Rails指南中重复。。。但我还在写文档,它还不完整。

要确保Plezi为'/ws'路由启用websocket,请添加一个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使用碘作为服务器,绕过Rack的hijack API(碘是Ruby的快速C扩展,它充当Rack服务器,支持本地websocket)。

在Plezi的使用Rails/Sinatra/Rack的Plezi指南中,有人指出,当在Rails/Sinetra/Rack中使用Plezi时:

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

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

Apache(或Nginx)和Passenger呢

Apache可以将请求转发到碘,这很像代理,类似于Apache与puma、passenger、unicorn、thin和其他应用服务器协同工作的方式。

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

性能

测试并查看。

碘是一个C扩展,它利用了epollkqueue系统调用,这些调用非常快速,是为并发而构建的。此外,碘有一个非常好的内存管理设计,传递到"Ruby land"的Ruby对象经常被回收或清除,以优化性能。。。但这只是说说而已。只有一种方法可以知道——测试。

相关内容

  • 没有找到相关文章

最新更新