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

时间:2015-11-14 06:48:03

标签: websocket streaming live-streaming

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

忽略身份验证之类的东西,构建可以实现此目的的服务器最简单的方法是什么?我对一大块数据到达服务器时会发生什么感到困惑。它将进入内存中的缓冲区,然后如何将其分发给等待它的n个消费者?某种循环缓冲? websockets是否适合此协议?谢谢。

1 个答案:

答案 0 :(得分:1)

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

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 echo test使用两个浏览器窗口测试了连接,一个是“流式”,另一个是监听。

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

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

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

魔法发生在IO核心,我把它放在一个名为Iodine的单独的Ruby gem(Ruby库被称为'gems')中。

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

挖掘that piece of the code is here的一个很好的切入点。当您遇到方法each时,请注意它是从the core Protocol继承并使用从IO map派生的数组。

Iodine的websocket实现遍历IO处​​理程序数组(value映射的key=>value一半),如果IO处理程序是Websocket,它会将消息“广播”到该IO处理程序由invoking the on_broadcst callback。回调被调用asynchronouslylocks the IO handler while being executed,以避免冲突。

Plezi leverages Iodine's broadcast method并使用相同的概念,以便the on_broadcast callback过滤掉不相关的消息。

出于性能原因,单播的工作方式稍有不同,但它大致相似。

我很抱歉在我的代码中使用了很多简写...我猜之前的Ruby习惯。我经常使用condition ? when_true : when_false速记,并倾向于将东西压成单行......但它应该大部分都是可读的。

祝你好运!