diff --git a/.travis.yml b/.travis.yml index 950fb65..363987a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,9 @@ rvm: services: - redis-server +before_install: + - gem install bundler + before_script: - git submodule update --init --recursive diff --git a/README.md b/README.md index e22755f..bd13775 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,27 @@ The full list of settings is as follows. * `:database` - number of database to use, default is `0` * `:namespace` - prefix applied to all keys, default is `''` * `:socket` - path to Unix socket if `unixsocket` is set +* `:master_name` - name of the master, controlling sentinels, default is `nil` +* `:sentinels` - array of sentinels, default is `nil` +Sentinels could be specified as follows + +```rb +sentinels = [ + 'your_redis_host.com:26379', + 'your_redis_host.com:26380', + 'your_redis_host.com:26381' + ] + +sentinels = [ + {url:'blah://sentinel5.example.net:26381'}, + {url:'blah://sentinel5.example.net:26382'}, + {url:'blah://sentinel5.example.net:26383'} + ] +``` +When you specify sentinels, you should also specify master name. +Gem em-hiredis-sentinel is used in order to get sentinel technology support +https://github.com/livehelpnow/em-hiredis-sentinel ## License diff --git a/faye-redis.gemspec b/faye-redis.gemspec index 1545c3f..02c63bf 100644 --- a/faye-redis.gemspec +++ b/faye-redis.gemspec @@ -14,8 +14,9 @@ Gem::Specification.new do |s| Dir.glob('lib/**/*.rb') s.add_dependency 'eventmachine', '>= 0.12.0' - s.add_dependency 'em-hiredis', '>= 0.2.0' + s.add_dependency 'em-hiredis', '>= 0.3.0' s.add_dependency 'multi_json', '>= 1.0.0' + s.add_dependency 'em-hiredis-sentinel', '>= 0.2.3' s.add_development_dependency 'rspec' s.add_development_dependency 'rspec-eventmachine' diff --git a/lib/faye/redis.rb b/lib/faye/redis.rb index 5dd09fb..192057b 100644 --- a/lib/faye/redis.rb +++ b/lib/faye/redis.rb @@ -1,4 +1,5 @@ require 'em-hiredis' +require 'em-hiredis-sentinel' require 'multi_json' module Faye @@ -32,8 +33,14 @@ def init gc = @options[:gc] || DEFAULT_GC @ns = @options[:namespace] || '' socket = @options[:socket] || nil - - if uri + sentinels = @options[:sentinels] || nil + master_name = @options[:master_name] || nil + + if sentinels && master_name + @redis = EventMachine::Hiredis::Sentinel::RedisClient.new(sentinels: sentinels, + master_name: master_name).connect + @server.debug 'Redis has been initialized with sentinels' + elsif uri @redis = EventMachine::Hiredis.connect(uri) elsif socket @redis = EventMachine::Hiredis::Client.new(socket, nil, auth, db).connect @@ -177,7 +184,7 @@ def empty_queue(client_id) @redis.multi @redis.lrange(key, 0, -1) @redis.del(key) - @redis.exec.callback do |json_messages, deleted| + @redis.exec.callback do |json_messages, deleted| next unless json_messages messages = json_messages.map { |json| MultiJson.load(json) } @server.deliver(client_id, messages) @@ -234,7 +241,5 @@ def with_lock(lock_name, &block) end end end - end end -