Class: RubySkynet::Doozer::ServiceRegistry

Inherits:
Object
  • Object
show all
Includes:
SemanticLogger::Loggable
Defined in:
lib/ruby_skynet/doozer/service_registry.rb

Defined Under Namespace

Classes: ServerInfo

Instance Method Summary collapse

Constructor Details

#initializeServiceRegistry

Create a service registry See: RubyDoozer::Registry for the parameters



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 18

def initialize
  # Registry has the following format
  #  Key: [String] 'name/version/region'
  #  Value: [Array<String>] 'host:port', 'host:port'
  @cache = ThreadSafe::Hash.new

  # Supply block to load the current keys from the Registry
  @registry = Doozer::Registry.new(:root => '/services') do |key, value|
    service_info_changed(key, value)
  end
  # Register Callbacks
  @registry.on_update {|path, value| service_info_changed(path, value) }
  @registry.on_delete {|path|        service_info_changed(path) }

  # Zookeeper Registry also supports on_create
  @registry.on_create {|path, value| service_info_changed(path, value) } if @registry.respond_to?(:on_create)
end

Instance Method Details

#deregister_service(name, version, region, hostname, port) ⇒ Object

Deregister the supplied service from the Registry



60
61
62
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 60

def deregister_service(name, version, region, hostname, port)
  @registry.delete("#{name}/#{version}/#{region}/#{hostname}/#{port}")
end

#on_server_removed(server, &block) ⇒ Object

Invokes registered callbacks when a specific server is shutdown or terminates Not when a server de-registers itself The callback will only be called once and will need to be re-registered after being called if future callbacks are required for that server



87
88
89
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 87

def on_server_removed(server, &block)
  ((@on_server_removed_callbacks ||= ThreadSafe::Hash.new)[server] ||= ThreadSafe::Array.new) << block
end

#register_service(name, version, region, hostname, port) ⇒ Object

Register the supplied service at this Skynet Server host and Port



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 42

def register_service(name, version, region, hostname, port)
  @registry["#{name}/#{version}/#{region}/#{hostname}/#{port}"] = {
    "Config" => {
      "UUID"    => "#{hostname}:#{port}-#{$$}-#{name}-#{version}",
      "Name"    => name,
      "Version" => version.to_s,
      "Region"  => region,
      "ServiceAddr" => {
        "IPAddress" => hostname,
        "Port"      => port,
        "MaxPort"   => port + 999
      },
    },
    "Registered" => true
  }
end

#servers_for(name, version = '*', region = RubySkynet.region) ⇒ Object

Returns [Array<String>] a list of servers implementing the requested service

Raises:



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 65

def servers_for(name, version='*', region=RubySkynet.region)
  if version == '*'
    # Find the highest version for the named service in this region
    version = -1
    @cache.keys.each do |key|
      if match = key.match(/#{name}\/(\d+)\/#{region}/)
        ver = match[1].to_i
        version = ver if ver > version
      end
    end
  end
  servers = if server_infos = @cache["#{name}/#{version}/#{region}"]
    server_infos.first.servers
  end
  raise ServiceUnavailable.new("No servers available for service: #{name} with version: #{version} in region: #{region}") unless servers
  servers
end

#to_hObject

Returns the Service Registry as a Hash



37
38
39
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 37

def to_h
  @cache.dup
end