ruby_skynet 1.2.7 → 1.3.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
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