Sha256: 9184c9cd1826ac630b89113e2b0255f4737a5aaedf055ff5853eb026abf53c10

Contents?: true

Size: 1.17 KB

Versions: 6

Compression:

Stored size: 1.17 KB

Contents

require 'concurrent'
require "dryad"
require "dryad/cluster/version"
require "dryad/cluster/round_robin"

module Dryad
  module Cluster
    class Error < StandardError; end
    class NoServicesError < Error; end

    class << self
      REGISTRY = Object.const_get(Dryad.configuration.registry)
      CLUSTERS = {}

      def round_robin(schema, service_name)
        groups = ['_global_', Dryad.configuration.group]
        full_name = Dryad::Core::Service.full_name(schema, service_name)
        if CLUSTERS[full_name].nil?
          CLUSTERS[full_name] = Dryad::Cluster::RoundRobin.new
          CLUSTERS[full_name].set_services(sorted_instances(service_name, schema, groups))
        end
        begin
          retries ||= 0
          CLUSTERS[full_name].service
        rescue Dryad::Cluster::NoServicesError
          CLUSTERS[full_name].set_services(sorted_instances(service_name, schema, groups))
          retry if (retries += 1) < 2
        end
      end

      def sorted_instances(service_name, schema, groups)
        sis = REGISTRY.service_instances(service_name, schema, groups)
        sis.sort {|a, b| "#{a.address}:#{a.port}" <=> "#{b.address}:#{b.port}"}
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 2 rubygems

Version Path
dryad-0.2.1 dryad-cluster/lib/dryad/cluster.rb
dryad-cluster-0.2.1 lib/dryad/cluster.rb
dryad-0.2.0 dryad-cluster/lib/dryad/cluster.rb
dryad-cluster-0.2.0 lib/dryad/cluster.rb
dryad-0.1.1 dryad-cluster/lib/dryad/cluster.rb
dryad-cluster-0.1.1 lib/dryad/cluster.rb