3

リアルタイムのプッシュ通知用に Juggernaut 2 を使用して Rails アプリを作成していますが、この問題に対処する方法がわかりません。チャット ルームに多数のユーザーがいて、タイマーを実行して、チャット ルームの各ブラウザーに 30 秒ごとにプッシュを送信できるようにしたいと考えています。Juggernaut 2 は node.js 上に構築されているため、このコードをそこに記述する必要があると想定しています。これを Juggernaut 2 と統合するという点で、どこから始めればよいかわかりません。

4

3 に答える 3

1

可変時間間隔で質問を押し出すクイズシステムを実装しました。次のようにしました。

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' を使用してクイズのタイミングのバックグラウンド プロセスを実行し、受信したスコアを引き続き処理できるようにすることでした。

これがどれほどスケーラブルかはわかりません。

于 2011-07-12T01:09:34.980 に答える
1

私はジャガーノートを簡単に閲覧しただけなので、私の答えは一粒の塩で考えてください...

  1. Channel オブジェクト (https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/channel.js) に興味があるかもしれません。存在するすべてのチャネル。30 秒の繰り返しタイマー (setInterval - http://nodejs.org/docs/v0.4.2/api/timers.html#setInterval ) を設定して、すべてのチャネルで何かを行うことができます。
  2. 各ループ反復で何をすべきか? さて、前述の Channel コードへのリンクには、publish メソッドがあります。

    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.channels を Channel.channels に設定して Message オブジェクトを作成する必要があり、そのメッセージを publish メソッドに渡すと、すべてのクライアントに送信されます。

あなたのメッセージの内容については、あなたがクライアント側で何を使用しているのかわかりません (socket.io? Juggernaut と socket.io から誰かが既に構築したチャット クライアントですか?) ので、それはあなた次第です。

間隔を作成し、コールバックを開始してメッセージをすべてのチャネルに発行するコードを配置する場所については、指定されたポートでリッスンする実際のサーバーを作成するコードをここで確認することをお勧めします: (https://github. com/maccman/juggernaut/blob/master/lib/juggernaut/server.js) init() 内で間隔をアタッチすると、サーバーを起動するとすぐに 30 秒ごとにチェックされ、指定されたメッセージがすべてのサーバーに発行されます。チャネル

于 2011-03-08T17:37:14.307 に答える
1

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
于 2011-05-31T22:04:53.653 に答える