Sha256: 416b74ee8d456352f7463dc8e1177fe1032a2f18c15ba6057cca42a6d32d8c9f

Contents?: true

Size: 1.28 KB

Versions: 7

Compression:

Stored size: 1.28 KB

Contents

require 'concurrent'
require "dryad/core"
require "dryad/consul"
require "dryad/cluster/railtie" if defined?(Rails)
require "dryad/cluster/version"
require "dryad/cluster/round_robin"

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

    class << self
      attr_accessor :configuration
      CLUSTERS = {}

      def round_robin(schema, service_name)
        groups = ['_global_', @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)
        registry = Object.const_get(@configuration.registry)
        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

7 entries across 7 versions & 2 rubygems

Version Path
dryad-cluster-0.3.4 lib/dryad/cluster.rb
dryad-cluster-0.3.2 lib/dryad/cluster.rb
dryad-cluster-0.3.0 lib/dryad/cluster.rb
dryad-cluster-0.2.7 lib/dryad/cluster.rb
dryad-cluster-0.2.6 lib/dryad/cluster.rb
dryad-0.2.5 dryad-cluster/lib/dryad/cluster.rb
dryad-cluster-0.2.5 lib/dryad/cluster.rb