我在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中删除任何服务器(即thin
、puma
、unicorn
等)。
Apache(或Nginx)和Passenger呢
Apache可以将请求转发到碘,这很像代理,类似于Apache与puma、passenger、unicorn、thin和其他应用服务器协同工作的方式。
可以使用Apache或Nginx,但不能使用乘客。
性能
测试并查看。
碘是一个C扩展,它利用了epoll
或kqueue
系统调用,这些调用非常快速,是为并发而构建的。此外,碘有一个非常好的内存管理设计,传递到"Ruby land"的Ruby对象经常被回收或清除,以优化性能。。。但这只是说说而已。只有一种方法可以知道——测试。