服务器架构:websocket组播服务器



构建一个服务器的最简单方法是什么?该服务器通过网络套接字接收传入连接,并将流入该套接字的数据流式传输到其他网络套接字上的n订阅者。以流媒体应用程序为例,其中一个人正在向n消费者广播。

忽略身份验证之类的事情,构建一个能够实现这一点的服务器的最简单方法是什么?我有点困惑,当一大块数据到达服务器时会发生什么。它将进入内存中的缓冲区,然后如何将其分配给等待它的n消费者?某种循环缓冲区?websocket是一个合适的协议吗?谢谢

这里有一个使用Ruby Plezi框架的框架(我是作者,所以我有偏见):

require 'plezi'
class Client
   # Plezi recognizes websocket handlers by the presence of the
   # `on_message` callback.
   def on_message data
      true
   end
   protected
   # this will be out event.
   def publish data
      write data
   end
end
class Streamer
   def on_message data
      Client.broadcast :publish, data
   end
end
# the streamer will connect to the /streamer path
route '/streamer', Streamer
# the client will connect to the /streamer path
route '/', Client
# on irb, we start the server by exiting the `irb` terminal
exit

您可以用Ruby终端(irb)测试它——就这么简单。

我使用Websocket.org回声测试测试了两个浏览器窗口的连接,一个是"流媒体",另一个是监听。

  • 使用ws://localhost:3000/streamer进行流媒体websocket连接

  • 使用ws://localhost:3000/作为客户端的连接。

编辑(与您对图书馆和建筑的评论有关)

神奇的事情发生在IO核心,我把它放在一个单独的Ruby gem(Ruby库被称为"gem")中,名为碘。

碘利用Ruby的面向对象方法(在Ruby中,一切都是一个对象)来处理广播。

这里是深入研究这段代码的一个很好的切入点。当您遇到方法each时,请注意它是从核心协议继承的,并使用从IO映射派生的Array。

碘的websocket实现遍历IO处理程序数组(key=>value映射的value的一半),如果IO处理程序是websocket,它将通过调用on_broadcst回调将消息"广播"给该IO处理程序。回调是异步调用的,它在执行时锁定IO处理程序,以避免冲突。

Plezi利用了碘的broadcast方法,并使用了相同的概念,因此on_broadcast回调将过滤掉不相关的消息。

由于性能原因,单播的工作方式略有不同,但基本上是相似的。

很抱歉在我的代码中使用了很多简写。。。我想是Ruby之前的习惯。我经常使用condition ? when_true : when_false的简写,倾向于把东西压缩成单行。。。但它应该是可读的。

祝你好运!

相关内容

  • 没有找到相关文章

最新更新