为什么 websocket-rails 需要作为独立服务器启动以支持基于非 eventmachine 的 web 服务器?

why websocket-rails need to started as a standalone server to support non-eventmachine based web servers?

from websocket-rails wiki, websocket-rails need to started as standalone server when we use Phusion Passenger or Unicorn, but I found faye-rails不需要这样做。它们之间有什么区别?

区别在于API用于"hijacking"或控制插座。

两种解决方案都将原始套接字从原始服务器中取出并独立于服务器处理它...但是,websocket-rails 使用基于 API 的 EventMachine,而 Faye 检查不同的支持选项, 比如 hijack API.

因此,当使用非基于 EventMachine 的服务器时,websocket-rails 无法将套接字从服务器上移走,而是运行一个单独的服务器,该服务器仅处理 Websocket 连接。

其他方法包括根据 the proposed Websocket Rack Specification draft, which is implemented by Iodine 对 websocket 协议的服务器端支持(免责声明,这是我的项目)。其他平台(即 Puma)也在努力支持该规范。

这种方法将套接字的控制权交给原始服务器,让原始服务器处理所有协议细节。它通常允许更好的资源处理,因为套接字处理是统一的并且通常资源使用得到更好的优化。此外,通过这种方法,可以避免代码重复并且内存占用通常更小。

这个新规范和方法的另一个好处是,编写体面的服务器的人通常更了解网络和服务器编程问题(例如缓慢的客户端 DoS 攻击问题等),从而实现更健壮和安全的 Websocket实施。

P.S.

如果可能的话,我会避免 websocket-rails,ActionCable 可能会有更好的 Rails 集成,意外的套接字劫持可能会破坏中间件,导致奇怪的错误(在某一时刻 hijack 会导致奇怪的数据库连接池问题,连接未返回到池中)。

祝你好运!