ruby_skynet 1.2.7 → 1.3.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d66558afbf4e84bec8db1eb77f09b6e2f2157cfd
4
- data.tar.gz: 7d99411322f3550d9cbc4bfca9305470d622b6dc
3
+ metadata.gz: c969a82d83df34cb54f6417180b098db0a83ccaa
4
+ data.tar.gz: de2482f4598ad614af99ae74122d91fbbc578233
5
5
  SHA512:
6
- metadata.gz: 473f10c3632f770220484db927cc9ca3052c6e5b963e90ffae00eaa8358697a5a262f8189db88fe42127f549325ce0031009c68c98fd6b431145d568a323dab6
7
- data.tar.gz: 4e76abe1ce6771be9f397918dfe8b61e2c325364cae0067ee6cf8d1ab985a31e017636cfaa19dd54eb806455d021928ceaede6fa9f2ac9f8600a107a4fa88912
6
+ metadata.gz: 9777072ab66461a26c5f32befd5e9d65cdcca68d34d0f0a71b66b91f2ac66d958adb2aceb06acba828d86436d65ad5aa64ff971a52eb474c736e895f8854e544
7
+ data.tar.gz: ced033f9f4c2987abbc6ae7c18f2044b8d01d9d5bac73f877feef12604936b96f6778ff3ab0fe1e20a9af4af40290388f2401f8b71034e07b36292d75bfb6f24
data/Gemfile CHANGED
@@ -8,15 +8,13 @@ gem "rake"
8
8
  gem "semantic_logger", ">= 2.1"
9
9
  gem "resilient_socket"
10
10
  # Doozer Client
11
- gem "ruby_doozer"
11
+ #gem "ruby_doozer"
12
12
  # Zookeeper Client
13
13
  gem "zookeeper"
14
14
  # Thread Safe Hash and Array
15
15
  gem "thread_safe"
16
- # Connection pool
17
- gem "gene_pool"
18
16
  # For looking up Service entries in Service Registry
19
17
  gem "multi_json"
20
18
  # Wire format when communicating with services
21
- gem "bson"
19
+ gem "bson", '1.5.2'
22
20
  gem "bson_ext", :platform => :ruby
@@ -1,57 +1,46 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- activesupport (4.0.0)
4
+ activesupport (4.0.2)
5
5
  i18n (~> 0.6, >= 0.6.4)
6
6
  minitest (~> 4.2)
7
7
  multi_json (~> 1.3)
8
8
  thread_safe (~> 0.1)
9
9
  tzinfo (~> 0.3.37)
10
10
  atomic (1.1.14)
11
- bson (1.9.2)
12
- bson_ext (1.9.2)
13
- bson (~> 1.9.2)
14
- gene_pool (1.3.0)
15
- i18n (0.6.5)
11
+ bson (1.5.2)
12
+ bson_ext (1.5.2)
13
+ bson (= 1.5.2)
14
+ i18n (0.6.9)
16
15
  minitest (4.7.5)
17
- multi_json (1.8.0)
16
+ multi_json (1.8.2)
18
17
  rake (10.1.0)
19
18
  resilient_socket (0.5.0)
20
19
  semantic_logger (>= 2.1)
21
- ruby_doozer (0.8.1)
22
- gene_pool (>= 1.3.0)
23
- multi_json (>= 1.6.1)
24
- resilient_socket (>= 0.5.0)
25
- ruby_protobuf (>= 0.4.11)
26
- semantic_logger (>= 2.1)
27
- sync_attr (>= 1.0.0)
28
- ruby_protobuf (0.4.11)
29
- semantic_logger (2.2.0)
20
+ semantic_logger (2.6.1)
30
21
  sync_attr (>= 1.0)
31
22
  thread_safe (>= 0.1.0)
32
23
  shoulda (3.5.0)
33
24
  shoulda-context (~> 1.0, >= 1.0.1)
34
25
  shoulda-matchers (>= 1.4.1, < 3.0)
35
- shoulda-context (1.1.5)
36
- shoulda-matchers (2.3.0)
26
+ shoulda-context (1.1.6)
27
+ shoulda-matchers (2.4.0)
37
28
  activesupport (>= 3.0.0)
38
29
  sync_attr (1.0.0)
39
30
  thread_safe (0.1.3)
40
31
  atomic
41
- tzinfo (0.3.37)
42
- zookeeper (1.4.6)
32
+ tzinfo (0.3.38)
33
+ zookeeper (1.4.7)
43
34
 
44
35
  PLATFORMS
45
36
  ruby
46
37
 
47
38
  DEPENDENCIES
48
- bson
39
+ bson (= 1.5.2)
49
40
  bson_ext
50
- gene_pool
51
41
  multi_json
52
42
  rake
53
43
  resilient_socket
54
- ruby_doozer
55
44
  semantic_logger (>= 2.1)
56
45
  shoulda
57
46
  thread_safe
@@ -11,8 +11,39 @@ module RubySkynet
11
11
  autoload :Client, 'ruby_skynet/client'
12
12
  autoload :Service, 'ruby_skynet/service'
13
13
  autoload :Server, 'ruby_skynet/server'
14
- autoload :Registry, 'ruby_skynet/registry'
15
- autoload :ServiceRegistry, 'ruby_skynet/service_registry'
14
+ autoload :Zookeeper, 'ruby_skynet/zookeeper'
15
+ end
16
+
17
+ # Autodetect if Zookeeper gem is loaded, otherwise look for Doozer
18
+ module RubySkynet
19
+ begin
20
+ require 'zookeeper'
21
+ require 'zookeeper/client'
22
+ require 'ruby_skynet/zookeeper/service_registry'
23
+ # Monkey-patch so that the Zookeeper JRuby code can handle nil values in Zookeeper
24
+ require 'ruby_skynet/zookeeper/extensions/java_base' if defined?(::JRUBY_VERSION)
25
+
26
+ # Shortcuts to loaded Registry classes
27
+ ServiceRegistry = RubySkynet::Zookeeper::ServiceRegistry
28
+ CachedRegistry = RubySkynet::Zookeeper::CachedRegistry
29
+ Registry = RubySkynet::Zookeeper::Registry
30
+ rescue LoadError
31
+ begin
32
+ require 'ruby_doozer'
33
+ require 'ruby_skynet/doozer/service_registry'
34
+
35
+ # Shortcuts to loaded Registry classes
36
+ ServiceRegistry = RubySkynet::Doozer::ServiceRegistry
37
+ CachedRegistry = Doozer::CachedRegistry
38
+ Registry = Doozer::Registry
39
+ rescue LoadError
40
+ require 'ruby_skynet/static_service_registry'
41
+
42
+ # Use Static Service Registry
43
+ ServiceRegistry = RubySkynet::StaticServiceRegistry
44
+ end
45
+
46
+ end
16
47
  end
17
48
 
18
49
  if defined?(Rails)
@@ -83,20 +83,14 @@ module RubySkynet
83
83
  # Skynet requires BSON RPC Calls to have the following format:
84
84
  # https://github.com/skynetservices/skynet/blob/master/protocol.md
85
85
  request_id = BSON::ObjectId.new.to_s
86
+
87
+ # Obtain list of servers implementing this service in order of priority
88
+ servers = ::RubySkynet.service_registry.servers_for(skynet_name, skynet_version, skynet_region)
89
+
86
90
  logger.tagged request_id do
87
91
  logger.benchmark_info "Called Skynet Service: #{skynet_name}.#{method_name}" do
88
- retries = 0
89
- # If it cannot connect to a server, try a different server
90
- begin
91
- Connection.with_connection(::RubySkynet.service_registry.server_for(skynet_name, skynet_version, skynet_region), connection_params) do |connection|
92
- connection.rpc_call(request_id, skynet_name, method_name, parameters)
93
- end
94
- rescue ResilientSocket::ConnectionFailure => exc
95
- if (retries < 3) && exc.cause.is_a?(Errno::ECONNREFUSED)
96
- retries += 1
97
- retry
98
- end
99
- # TODO rescue ServiceUnavailable retry x times until the service becomes available
92
+ Connection.with_connection(servers, connection_params) do |connection|
93
+ connection.rpc_call(request_id, skynet_name, method_name, parameters)
100
94
  end
101
95
  end
102
96
  end
@@ -1,5 +1,4 @@
1
1
  require 'bson'
2
- require 'gene_pool'
3
2
  require 'thread_safe'
4
3
  require 'resilient_socket'
5
4
  require 'sync_attr'
@@ -17,20 +16,6 @@ module RubySkynet
17
16
  # Returns the underlying socket being used by a Connection instance
18
17
  attr_reader :socket
19
18
 
20
- # Default Pool configuration
21
- sync_cattr_accessor :pool_config do
22
- {
23
- :pool_size => 30, # Maximum number of connections to any one server
24
- :warn_timeout => 2, # Log a warning if no connections are available after the :warn_timeout seconds
25
- :timeout => 10, # Raise a Timeout exception if no connections are available after the :timeout seconds
26
- :idle_timeout => 600, # Renew a connection if it has been idle for this period of time
27
- }
28
- end
29
-
30
- # For each server there is a connection pool keyed on the
31
- # server address: 'host:port'
32
- @@connection_pools = ThreadSafe::Hash.new
33
-
34
19
  # Returns a new RubySkynet connection to the server
35
20
  #
36
21
  # Parameters:
@@ -50,8 +35,8 @@ module RubySkynet
50
35
  # :connect_retry_interval [Float]
51
36
  # Number of seconds between connection retry attempts after the first failed attempt
52
37
  # Default: 0.5
53
- def initialize(server, params = {})
54
- self.logger = SemanticLogger["#{self.class.name} [#{server}]"]
38
+ def initialize(servers, params = {})
39
+ params = params.dup
55
40
 
56
41
  # User configurable options
57
42
  params[:read_timeout] ||= 60
@@ -95,8 +80,8 @@ module RubySkynet
95
80
  end
96
81
 
97
82
  # To prevent strange issues if user incorrectly supplies server names
98
- params.delete(:servers)
99
- params[:server] = server
83
+ params.delete(:server)
84
+ params[:servers] = servers
100
85
 
101
86
  @socket = ResilientSocket::TCPClient.new(params)
102
87
  end
@@ -209,44 +194,19 @@ module RubySkynet
209
194
 
210
195
  # Execute the supplied block with a connection from the pool
211
196
  def self.with_connection(server, params={}, &block)
212
- (@@connection_pools[server] ||= new_connection_pool(server, params)).with_connection(&block)
197
+ conn = nil
198
+ begin
199
+ conn = new(server, params)
200
+ block.call(conn)
201
+ ensure
202
+ conn.close if conn
203
+ end
213
204
  end
214
205
 
215
206
  def close
216
207
  @socket.close if @socket
217
208
  end
218
209
 
219
- ########################
220
- protected
221
-
222
- # Returns a new connection pool for the specified server
223
- def self.new_connection_pool(server, params={})
224
- # Connection pool configuration options
225
- config = pool_config.dup
226
-
227
- logger = SemanticLogger::Logger.new("#{self.class.name} [#{server}]")
228
-
229
- # Method to call to close idle connections
230
- config[:close_proc] = :close
231
- config[:logger] = logger
232
-
233
- pool = GenePool.new(pool_config) do
234
- new(server, params)
235
- end
236
-
237
- # Cleanup corresponding connection pool when a server terminates
238
- RubySkynet.service_registry.on_server_removed(server) do
239
- pool = @@connection_pools.delete(server)
240
- # Cannot close all the connections since they could still be in use
241
- pool.remove_idle(0) if pool
242
- #pool.close if pool
243
- logger.debug "Connection pool released"
244
- end
245
-
246
- pool
247
- end
248
-
249
210
  end
250
-
251
211
  end
252
212
 
@@ -1,6 +1,5 @@
1
1
  require 'semantic_logger'
2
2
  require 'thread_safe'
3
- require 'gene_pool'
4
3
  require 'resolv'
5
4
 
6
5
  #
@@ -62,18 +61,6 @@ module RubySkynet
62
61
  @registry.delete("#{name}/#{version}/#{region}/#{hostname}/#{port}")
63
62
  end
64
63
 
65
- # Return a server that implements the specified service
66
- def server_for(name, version='*', region=RubySkynet.region)
67
- if servers = servers_for(name, version, region)
68
- # Randomly select one of the servers offering the service
69
- servers[rand(servers.size)]
70
- else
71
- msg = "No servers available for service: #{name} with version: #{version} in region: #{region}"
72
- logger.warn msg
73
- raise ServiceUnavailable.new(msg)
74
- end
75
- end
76
-
77
64
  # Returns [Array<String>] a list of servers implementing the requested service
78
65
  def servers_for(name, version='*', region=RubySkynet.region)
79
66
  if version == '*'
@@ -86,9 +73,11 @@ module RubySkynet
86
73
  end
87
74
  end
88
75
  end
89
- if server_infos = @cache["#{name}/#{version}/#{region}"]
76
+ servers = if server_infos = @cache["#{name}/#{version}/#{region}"]
90
77
  server_infos.first.servers
91
78
  end
79
+ raise ServiceUnavailable.new("No servers available for service: #{name} with version: #{version} in region: #{region}") unless servers
80
+ servers
92
81
  end
93
82
 
94
83
  # Invokes registered callbacks when a specific server is shutdown or terminates
@@ -0,0 +1,75 @@
1
+ require 'semantic_logger'
2
+ require 'thread_safe'
3
+
4
+ #
5
+ # RubySkynet Sevices Registry
6
+ #
7
+ # Loads a list of all services and which servers they are available on from a
8
+ # static YAML file
9
+ #
10
+ # Format of the YAML file
11
+ # key: [String] "<name>/<version>/<region>"
12
+ # value: [Array<String>] 'host:port', 'host:port'
13
+
14
+ #
15
+ module RubySkynet
16
+ class StaticServiceRegistry
17
+ include SemanticLogger::Loggable
18
+
19
+ # Create a service registry
20
+ def initialize(services = {})
21
+ @services = services
22
+ end
23
+
24
+ # Returns the Service Registry as a Hash
25
+ def to_h
26
+ @services.dup
27
+ end
28
+
29
+ # Register the supplied service at this Skynet Server host and Port
30
+ # Returns the UUID for the service that was created
31
+ def register_service(name, version, region, hostname, port)
32
+ server = "#{hostname}:#{port}"
33
+ key = "#{name}/#{version}/#{region}"
34
+ (@services[key] ||= []) << server
35
+ key
36
+ end
37
+
38
+ # Deregister the supplied service from the Registry
39
+ def deregister_service(name, version, region, hostname, port)
40
+ server = "#{hostname}:#{port}"
41
+ key = "#{name}/#{version}/#{region}"
42
+ if servers = @services[key]
43
+ servers.delete_if {|s| s == server}
44
+ @services.delete(key) if servers.count == 0
45
+ end
46
+ key
47
+ end
48
+
49
+ # Returns [Array<String>] a list of servers implementing the requested service
50
+ def servers_for(name, version='*', region=RubySkynet.region)
51
+ if version == '*'
52
+ # Find the highest version for the named service in this region
53
+ version = -1
54
+ @services.keys.each do |key|
55
+ if match = key.match(/#{name}\/(\d+)\/#{region}/)
56
+ ver = match[1].to_i
57
+ version = ver if ver > version
58
+ end
59
+ end
60
+ end
61
+ servers = @services["#{name}/#{version}/#{region}"]
62
+ raise ServiceUnavailable.new("No servers available for service: #{name} with version: #{version} in region: #{region}") unless servers
63
+ servers
64
+ end
65
+
66
+ # Invokes registered callbacks when a specific server is shutdown or terminates
67
+ # Not when a server de-registers itself
68
+ # The callback will only be called once and will need to be re-registered
69
+ # after being called if future callbacks are required for that server
70
+ def on_server_removed(server, &block)
71
+ #nop
72
+ end
73
+
74
+ end
75
+ end
@@ -1,3 +1,3 @@
1
1
  module RubySkynet #:nodoc
2
- VERSION = "1.2.7"
2
+ VERSION = "1.3.0.alpha1"
3
3
  end
@@ -1,6 +1,5 @@
1
1
  require 'semantic_logger'
2
2
  require 'thread_safe'
3
- require 'gene_pool'
4
3
  require 'resolv'
5
4
 
6
5
  #
@@ -76,18 +75,6 @@ module RubySkynet
76
75
  uuid
77
76
  end
78
77
 
79
- # Return a server that implements the specified service
80
- def server_for(name, version='*', region=RubySkynet.region)
81
- if servers = servers_for(name, version, region)
82
- # Randomly select one of the servers offering the service
83
- servers[rand(servers.size)]
84
- else
85
- msg = "No servers available for service: #{name} with version: #{version} in region: #{region}"
86
- logger.warn msg
87
- raise ServiceUnavailable.new(msg)
88
- end
89
- end
90
-
91
78
  # Returns [Array<String>] a list of servers implementing the requested service
92
79
  def servers_for(name, version='*', region=RubySkynet.region)
93
80
  if version == '*'
@@ -100,9 +87,11 @@ module RubySkynet
100
87
  end
101
88
  end
102
89
  end
103
- if server_infos = @cache["#{name}/#{version}/#{region}"]
90
+ servers = if server_infos = @cache["#{name}/#{version}/#{region}"]
104
91
  server_infos.first.servers
105
92
  end
93
+ raise ServiceUnavailable.new("No servers available for service: #{name} with version: #{version} in region: #{region}") unless servers
94
+ servers
106
95
  end
107
96
 
108
97
  # Invokes registered callbacks when a specific server is shutdown or terminates
@@ -0,0 +1,25 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ require 'date'
5
+ require 'ruby_skynet/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'ruby_skynet'
9
+ spec.version = RubySkynet::VERSION
10
+ spec.platform = Gem::Platform::RUBY
11
+ spec.authors = ['Reid Morrison']
12
+ spec.email = ['reidmo@gmail.com']
13
+ spec.homepage = 'https://github.com/ClarityServices/ruby_skynet'
14
+ spec.date = Date.today.to_s
15
+ spec.summary = "Skynet Ruby Client"
16
+ spec.description = "Ruby Client for invoking Skynet services"
17
+ spec.files = Dir.glob("lib/**/*") + Dir.glob("examples/**/*.rb") + %w(LICENSE.txt README.md)
18
+ spec.license = "Apache License V2.0"
19
+ spec.has_rdoc = true
20
+ spec.add_dependency 'semantic_logger', '>= 2.6.1'
21
+ spec.add_dependency 'resilient_socket', '>= 0.5.0'
22
+ spec.add_dependency 'sync_attr', '>= 1.0.0'
23
+ spec.add_dependency 'bson', '>= 1.5.2'
24
+ spec.add_dependency 'thread_safe'
25
+ end
@@ -50,7 +50,7 @@ class ClientTest < Test::Unit::TestCase
50
50
  client = RubySkynet::Client.new('SomeService','*','ClientTest')
51
51
  client.call(:test, :hello => 'there')
52
52
  end
53
- assert_match /No servers available for service: SomeService with version: \* in region: ClientTest/, exception.message
53
+ assert_match /No servers available for service: SomeService with version: -1 in region: ClientTest/, exception.message
54
54
  end
55
55
 
56
56
  end
@@ -42,7 +42,7 @@ class ServiceRegistryTest < Test::Unit::TestCase
42
42
  # Allow time for registry callback that service was deregistered
43
43
  sleep 0.1
44
44
  # No servers should be in the local registry
45
- # assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version, @region)
45
+ # assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version, @region)
46
46
  end
47
47
 
48
48
  should "find server using exact match" do
@@ -83,15 +83,21 @@ class ServiceRegistryTest < Test::Unit::TestCase
83
83
  end
84
84
 
85
85
  should "return nil when service not found" do
86
- assert_equal nil, RubySkynet.service_registry.servers_for('MissingService', @version, @region)
86
+ assert_raise RubySkynet::ServiceUnavailable do
87
+ RubySkynet.service_registry.servers_for('MissingService', @version, @region)
88
+ end
87
89
  end
88
90
 
89
91
  should "return nil when version not found" do
90
- assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version+1, @region)
92
+ assert_raise RubySkynet::ServiceUnavailable do
93
+ RubySkynet.service_registry.servers_for(@service_name, @version+1, @region)
94
+ end
91
95
  end
92
96
 
93
97
  should "return nil when region not found" do
94
- assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version, 'OtherRegion')
98
+ assert_raise RubySkynet::ServiceUnavailable do
99
+ RubySkynet.service_registry.servers_for(@service_name, @version, 'OtherRegion')
100
+ end
95
101
  end
96
102
  end
97
103
 
@@ -153,7 +153,7 @@ class ZookeeperRegistryTest < Test::Unit::TestCase
153
153
  sleep 0.1
154
154
  # Allow Zookeeper to send back the change
155
155
  @registry.delete('bar')
156
- sleep 0.3
156
+ sleep 2
157
157
  assert_equal 'bar', deleted_path
158
158
  end
159
159
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_skynet
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7
4
+ version: 1.3.0.alpha1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-19 00:00:00.000000000 Z
11
+ date: 2013-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: semantic_logger
@@ -122,7 +122,7 @@ files:
122
122
  - lib/ruby_skynet/ruby_skynet.rb
123
123
  - lib/ruby_skynet/server.rb
124
124
  - lib/ruby_skynet/service.rb
125
- - lib/ruby_skynet/service_registry.rb
125
+ - lib/ruby_skynet/static_service_registry.rb
126
126
  - lib/ruby_skynet/version.rb
127
127
  - lib/ruby_skynet/zookeeper.rb
128
128
  - lib/ruby_skynet/zookeeper/cached_registry.rb
@@ -131,6 +131,7 @@ files:
131
131
  - lib/ruby_skynet/zookeeper/json/serializer.rb
132
132
  - lib/ruby_skynet/zookeeper/registry.rb
133
133
  - lib/ruby_skynet/zookeeper/service_registry.rb
134
+ - ruby_skynet.gemspec
134
135
  - test/client_test.rb
135
136
  - test/service_registry_test.rb
136
137
  - test/service_test.rb
@@ -150,12 +151,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
151
  version: '0'
151
152
  required_rubygems_version: !ruby/object:Gem::Requirement
152
153
  requirements:
153
- - - '>='
154
+ - - '>'
154
155
  - !ruby/object:Gem::Version
155
- version: '0'
156
+ version: 1.3.1
156
157
  requirements: []
157
158
  rubyforge_project:
158
- rubygems_version: 2.0.3
159
+ rubygems_version: 2.1.11
159
160
  signing_key:
160
161
  specification_version: 4
161
162
  summary: Skynet Ruby Client
@@ -1,23 +0,0 @@
1
- # Define RubySkynet::ServiceRegistry based on whether the ZooKeeper or Doozer gem is present
2
- module RubySkynet
3
- begin
4
- require 'zookeeper'
5
- require 'zookeeper/client'
6
- require 'ruby_skynet/zookeeper/service_registry'
7
- # Monkey-patch so that the Zookeeper JRuby code can handle nil values in Zookeeper
8
- require 'ruby_skynet/zookeeper/extensions/java_base' if defined?(::JRUBY_VERSION)
9
- ServiceRegistry = RubySkynet::Zookeeper::ServiceRegistry
10
- CachedRegistry = RubySkynet::Zookeeper::CachedRegistry
11
- Registry = RubySkynet::Zookeeper::Registry
12
- rescue LoadError
13
- begin
14
- require 'ruby_doozer'
15
- require 'ruby_skynet/doozer/service_registry'
16
- rescue LoadError
17
- raise LoadError, "Must gem install either 'zookeeper' or 'ruby_doozer'. 'zookeeper' is recommended"
18
- end
19
- ServiceRegistry = RubySkynet::Doozer::ServiceRegistry
20
- CachedRegistry = Doozer::CachedRegistry
21
- Registry = Doozer::Registry
22
- end
23
- end