Таймеры на стороне сервера с Джаггернаутом 2

Я пишу приложение rails с Juggernaut 2 для push-уведомлений в реальном времени и не знаю, как решить эту проблему. У меня есть несколько пользователей в чате, и я хотел бы запустить таймер, чтобы каждые 30 секунд можно было нажимать на каждый браузер в чате. Juggernaut 2 построен на node.js, поэтому я предполагаю, что мне нужно написать этот код там. Я просто не знаю, с чего начать с точки зрения интеграции этого с Джаггернаутом 2.

3 ответа

Вот пример клиента, который отправляет каждые 30 секунд в Ruby.

Установите свой Джаггернаут с Redis и Node: установите ruby ​​и rubygems, затем запустите gem install juggernaut а также

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

Я только что кратко просмотрел Джаггернаут, так что прими мой ответ с крошкой соли...

  1. Возможно, вас заинтересует объект Channel (https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/channel.js). Вы заметите, что Channel.channel является объектом (представьте хэш рубина) все каналы, которые существуют. Вы можете установить 30-секундный таймер (setInterval - http://nodejs.org/docs/v0.4.2/api/timers.html), чтобы что-то делать со всеми вашими каналами.
  2. Что делать в каждой итерации цикла? Ну, ссылка на вышеупомянутый код канала имеет метод публикации:

    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, и если вы передадите это сообщение методу публикации, оно будет отправлено всем вашим клиентам.

Что касается содержания вашего сообщения, я не знаю, что вы используете на стороне клиента (socket.io? Клиент чата, который кто-то уже создал для вас из Juggernaut и socket.io?), Так что решать вам.

Что касается места размещения кода, создающего интервал и запускающего обратный вызов для публикации вашего сообщения на всех каналах, вы можете проверить здесь код, который создает реальный сервер, прослушивающий данный порт: (https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/server.js) Если вы добавите интервал в init(), то, как только вы запустите сервер, он будет проверять каждые 30 секунд, чтобы опубликовать ваше данное сообщение каждому канал

Мы внедрили систему викторин, которая выдвигала вопросы с переменным интервалом времени Мы сделали это следующим образом:

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 для запуска фонового процесса для определения времени опроса, чтобы мы могли обрабатывать входящие результаты.

Я понятия не имею, насколько это масштабируемо.

Другие вопросы по тегам