dryad-cluster 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: c423ba271b85dbd2cf4db26a3d8e813d68ec939f082033716cb34761a1fc08b6
4
- data.tar.gz: 964a0b0bca07e4aeff2379ad26947b9fa03f0cce38fe78c26427aff83c680f99
3
+ metadata.gz: c4e41d97f7f444f717e1eb18d83be6d91ad8bc2193614e30f3a89ae32db76ac5
4
+ data.tar.gz: 4414921185b93261f6fd4480b20269db784e2be38630bce346d291ff2c9ee579
5
5
  SHA512:
6
- metadata.gz: 17cb32d2c7ba3be2246d0c8b58178a17dfd468b466b603b7e17a03b25c254248305e6ee391b9d8b31fae3d8f71ceb12d5750ac0aaf91aead823df86889d0dc5c
7
- data.tar.gz: 1dd316d980efef495ae92867ee1ad1d0c71dfb490cc9582ed957a301ec90aafa2ecb1d76e035be44757d2be7b87237da1a65544c1fb4039aa5ca80e4eb5d51e7
6
+ metadata.gz: 82491e5a318d0a607119a0ff486d9a054309f6167e90e39da2592e453277e25eeb7a10df706bfbfe9576aa4159206f687dcdd99fdbb96e614bf5d71828df5b99
7
+ data.tar.gz: 9d318d37a0f10da3787301ab060f7c4863a2f3bdc3f0d998662d7bc75326be438be882b9870154e766acc8d52572d4317bf46c2c49796d85f8397137818a5431
@@ -1,24 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dryad-cluster (0.1.0.alpha)
5
- dryad-core (= 0.1.0.alpha)
4
+ dryad-cluster (0.1.1)
5
+ concurrent-ruby (~> 1.1, >= 1.1.5)
6
+ dryad-core (= 0.1.1)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
11
+ concurrent-ruby (1.1.5)
10
12
  deep_merge (1.2.1)
11
13
  diff-lcs (1.3)
12
14
  diplomat (2.2.4)
13
15
  deep_merge (~> 1.0, >= 1.0.1)
14
16
  faraday (~> 0.9)
15
- dryad-consul (0.1.0.alpha)
16
- diplomat
17
- dryad-core (= 0.1.0.alpha)
18
- dryad-core (0.1.0.alpha)
17
+ dryad-consul (0.1.1)
18
+ diplomat (~> 2.2, >= 2.2.4)
19
+ dryad-core (= 0.1.1)
20
+ dryad-core (0.1.1)
19
21
  faraday (0.15.4)
20
22
  multipart-post (>= 1.2, < 3)
21
- multipart-post (2.1.0)
23
+ multipart-post (2.1.1)
22
24
  rake (10.5.0)
23
25
  rspec (3.8.0)
24
26
  rspec-core (~> 3.8.0)
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
 
24
24
  spec.add_dependency "dryad-core", Dryad::Cluster::VERSION
25
+ spec.add_dependency "concurrent-ruby", "~> 1.1", ">= 1.1.5"
25
26
 
26
27
  spec.add_development_dependency "bundler", "~> 2.0"
27
28
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,16 +1,36 @@
1
+ require 'concurrent'
1
2
  require "dryad"
2
3
  require "dryad/cluster/version"
4
+ require "dryad/cluster/round_robin"
3
5
 
4
6
  module Dryad
5
7
  module Cluster
6
8
  class Error < StandardError; end
9
+ class NoServicesError < Error; end
7
10
 
8
11
  class << self
9
12
  REGISTRY = Object.const_get(Dryad.configuration.registry)
13
+ CLUSTERS = {}
10
14
 
11
15
  def round_robin(schema, service_name)
12
16
  groups = ['_global_', Dryad.configuration.group]
13
- REGISTRY.service_instances(service_name, schema, groups).first
17
+ full_name = Dryad::Core::Service.full_name(schema, service_name)
18
+ if CLUSTERS[full_name].nil?
19
+ CLUSTERS[full_name] = Dryad::Cluster::RoundRobin.new
20
+ CLUSTERS[full_name].set_services(sorted_instances(service_name, schema, groups))
21
+ end
22
+ begin
23
+ retries ||= 0
24
+ CLUSTERS[full_name].service
25
+ rescue Dryad::Cluster::NoServicesError
26
+ CLUSTERS[full_name].set_services(sorted_instances(service_name, schema, groups))
27
+ retry if (retries += 1) < 2
28
+ end
29
+ end
30
+
31
+ def sorted_instances(service_name, schema, groups)
32
+ sis = REGISTRY.service_instances(service_name, schema, groups)
33
+ sis.sort {|a, b| "#{a.address}:#{a.port}" <=> "#{b.address}:#{b.port}"}
14
34
  end
15
35
  end
16
36
  end
@@ -0,0 +1,22 @@
1
+ module Dryad
2
+ module Cluster
3
+ class RoundRobin
4
+ def initialize
5
+ @index = Concurrent::AtomicFixnum.new
6
+ @services = Concurrent::AtomicReference.new
7
+ end
8
+
9
+ def set_services(instances)
10
+ @services.set(instances)
11
+ end
12
+
13
+ def service
14
+ instances = @services.get()
15
+ if instances.nil? || instances.empty?
16
+ raise Dryad::Cluster::NoServicesError, "Round robin nodes are empty."
17
+ end
18
+ instances[@index.increment % instances.size]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -2,7 +2,7 @@ module Dryad
2
2
  module Cluster
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 0
5
+ TINY = 1
6
6
  PRE = nil
7
7
 
8
8
  VERSION = [MAJOR, MINOR, TINY, PRE].compact.join(".")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dryad-cluster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pan Jie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-05-13 00:00:00.000000000 Z
11
+ date: 2019-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dryad-core
@@ -16,14 +16,34 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.1.0
19
+ version: 0.1.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.1.0
26
+ version: 0.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.1.5
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.1'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.1.5
27
47
  - !ruby/object:Gem::Dependency
28
48
  name: bundler
29
49
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +104,7 @@ files:
84
104
  - bin/setup
85
105
  - dryad-cluster.gemspec
86
106
  - lib/dryad/cluster.rb
107
+ - lib/dryad/cluster/round_robin.rb
87
108
  - lib/dryad/cluster/version.rb
88
109
  homepage: https://github.com/jack0pan/dryad.rb
89
110
  licenses: