使用 Juggernaut 2 的服务器端计时器

Posted

技术标签:

【中文标题】使用 Juggernaut 2 的服务器端计时器【英文标题】:Server Side Timers with Juggernaut 2 【发布时间】:2011-07-10 19:13:08 【问题描述】:

我正在使用 Juggernaut 2 编写一个用于实时推送通知的 Rails 应用程序,但不知道如何解决这个问题。我在聊天室中有许多用户,我想运行一个计时器,以便每 30 秒推送一次到聊天室中的每个浏览器。 Juggernaut 2 是基于 node.js 构建的,所以我假设我需要在那里编写这段代码。我只是不知道从哪里开始将它与 Juggernaut 2 集成。

【问题讨论】:

github.com/maccman/juggernaut 不解释从哪里开始? 是的,Juggernaut 正在工作,我有一个聊天应用程序,我只是想在 node.js 中添加一个服务器端计时器并将其与 Juggernaut 集成。 【参考方案1】:

我只是简单地浏览了剑圣,所以我的答案持保留态度......

    您可能对 Channel 对象感兴趣 (https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/channel.js) 您会注意到 Channel.channel 是一个对象(想想 ruby​​ 的哈希)存在的所有通道。您可以设置一个 30 秒的循环计时器 (setInterval - http://nodejs.org/docs/v0.4.2/api/timers.html#setInterval) 对您的所有频道进行操作。

    每次循环迭代要做什么?嗯,前面提到的Channel代码的链接有一个发布方法:

    publish: function(message)
    var channels = message.getChannels();
    delete message.channels;
    
    for(var i=0, len = channels.length; i < len; i++) 
      message.channel = channels[i];
      var clients     = this.find(channels[i]).clients;
    
      for(var x=0, len2 = clients.length; x < len2; x++) 
        clients[x].write(message);
        
        
    

因此,您基本上必须创建一个 Message 对象,并将 message.channels 设置为 Channel.channels,如果您将该消息传递给 publish 方法,它将发送给您的所有客户端。

至于您的消息内容,我不知道您使用的是什么客户端(socket.io?有人已经在 J​​uggernaut 和 socket.io 上为您构建的聊天客户端?)所以这取决于您。

至于将创建间隔的代码放在哪里并触发回调以将您的消息发布到所有通道,您可能需要在此处查看创建在给定端口上侦听的实际服务器的代码:(https:/ /github.com/maccman/juggernaut/blob/master/lib/juggernaut/server.js)如果您在init()中附加时间间隔,那么一旦您启动服务器,它将每30秒检查一次以发布您的给定向每个频道发送消息

【讨论】:

仍在试图弄清楚这一切。这是一个很好的线索,非常感谢。 TenJack - 什么令人困惑?让我知道,我可以尝试提供帮助 嗨 ambertech,我现在主要的问题是我想为特定频道名称启动一个计时器,而不是为所有频道。我需要能够为每个单独的聊天室启动计时器。感谢您的帮助。【参考方案2】:

这是一个在 Ruby 中每 30 秒推送一次的示例客户端。

使用 Redis 和 Node 安装您的 Juggernaut:安装 ruby​​ 和 ruby​​gems,然后运行 ​​gem install juggernaut

#!/usr/bin/env ruby
require "rubygems"
require "juggernaut"
while 1==1
 Juggernaut.publish("channel1","some Message")
 sleep 30
end

【讨论】:

【参考方案3】:

我们实施了一个测验系统,该系统以可变的时间间隔推出问题。我们是这样做的:

def start_quiz
  Rails.logger.info("*** Quiz starting at #Time.now")
  $redis.flushall  # Clear all scores from database

  quiz = Quiz.find(params[:quizz] || 1 )
  @quiz_master = quiz.user  
  quiz_questions = quiz.quiz_questions.order("question_no ASC")

  spawn_block do 
    quiz_questions.each  |q|
      Rails.logger.info("*** Publishing question #q.question_no.")
      time_alloc = q.question_time
      Juggernaut.publish( select_channel("/quiz_stream"), :q_num => q.num, :q_txt => q.text :time=> time_alloc ) 
      sleep(time_alloc)             
      scoreboard = publish_scoreboard
      Juggernaut.publish( select_channel("/scoreboard"), :scoreboard => scoreboard ) 
    
  end

  respond_to do |format|
    format.all  render :nothing => true, :status => 200 
  end
end

在我们的案例中,关键是使用“spawn”为测验时间运行后台进程,以便我们仍然可以处理传入的分数。

我不知道它的可扩展性。

【讨论】:

以上是关于使用 Juggernaut 2 的服务器端计时器的主要内容,如果未能解决你的问题,请参考以下文章

从 Rails 监听 Juggernaut 事件

通过纯 HTTPS 连接为 Juggernaut 2 提供服务

如何在生产模式下运行 redis 服务器和 juggernaut 服务器

使用 juggernaut 作为 rails 插件时遇到问题

Rails 3.1 在 Ubuntu 11.10 上使用 Socket.io/Juggernaut

我想使用 Rails 建立一个聊天室,我应该使用 juggernaut 2 还是 cramp?