← All posts

使用faye + sidekiq制作实时消息队列

install faye and sidekiq

ruby
1# Gemfile
2
3
4# Faye
5gem 'faye-rails', '~> 2.0.0'
6gem 'faye-redis', '~> 0.2.0'
7gem 'faye', '1.0.3'
8
9# sidekiq
10gem 'sidekiq'

编辑 config/application.rb

ruby
1config.middleware.use FayeRails::Middleware, mount: '/faye', engine: {type: Faye::Redis, uri: "#{ENV['REDIS_URL']}/4"}, :timeout => 25 do
2 map '/api/questions/status' => Api::QuestionStateController
3end

增加worker类

ruby
1# app/workers/question_state_worker.rb
2class QuestionStateWorker
3 include Sidekiq::Worker
4
5
6 def get_question_state(user_id)
7 Question.where("user_id = ? and finished= ?", user_id, false).select("id,user_id,has_teacher_answer").to_json
8 end
9
10 def keep_state(user_id, data)
11 $redis.set "questions_state_#{user_id}", data
12 end
13
14 def perform(user_id)
15 keep_state(user_id, get_question_state(user_id))
16 end
17
18end

监听数据库

ruby
1
2# app/realtime/api/question_state_controller.rb
3class Api::QuestionStateController < FayeRails::Controller
4 observe Question, :after_save do |question|
5 QuestionStateWorker.perform_async(question.user_id)
6 end
7
8end