nats 0.4.28 → 0.5.0.beta.12

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.
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  module NATSD #:nodoc: all
2
4
 
3
5
  # Subscriber
@@ -8,7 +10,7 @@ module NATSD #:nodoc: all
8
10
  class << self
9
11
  attr_reader :id, :info, :log_time, :auth_required, :ssl_required, :debug_flag, :trace_flag, :syslog, :options
10
12
  attr_reader :max_payload, :max_pending, :max_control_line, :auth_timeout, :ssl_timeout, :ping_interval, :ping_max
11
- attr_accessor :varz, :healthz, :max_connections, :num_connections, :in_msgs, :out_msgs, :in_bytes, :out_bytes
13
+ attr_accessor :varz, :healthz, :connections, :max_connections, :num_connections, :in_msgs, :out_msgs, :in_bytes, :out_bytes
12
14
 
13
15
  alias auth_required? :auth_required
14
16
  alias ssl_required? :ssl_required
@@ -36,13 +38,16 @@ module NATSD #:nodoc: all
36
38
  def setup(argv)
37
39
  process_options(argv)
38
40
 
39
- @id, @cid = fast_uuid, 1
41
+ @id, @cid, @rid = fast_uuid, 1, 1
40
42
  @sublist = Sublist.new
41
43
 
44
+ @connections = {}
42
45
  @num_connections = 0
43
46
  @in_msgs = @out_msgs = 0
44
47
  @in_bytes = @out_bytes = 0
45
48
 
49
+ @num_routes = 0
50
+
46
51
  @info = {
47
52
  :server_id => Server.id,
48
53
  :host => host,
@@ -62,6 +67,7 @@ module NATSD #:nodoc: all
62
67
  # These log messages visible to controlling TTY
63
68
  log "Starting #{NATSD::APP_NAME} version #{NATSD::VERSION} on port #{NATSD::Server.port}"
64
69
  log "Starting http monitor on port #{@options[:http_port]}" if @options[:http_port]
70
+ log "Starting routing on port #{@options[:cluster_port]}" if @options[:cluster_port]
65
71
  log "Switching to daemon mode"
66
72
  end
67
73
  opts = {
@@ -85,12 +91,14 @@ module NATSD #:nodoc: all
85
91
  File.open(@options[:pid_file], 'w') { |f| f.puts "#{Process.pid}" } if @options[:pid_file]
86
92
  end
87
93
 
88
- def subscribe(sub)
94
+ def subscribe(sub, is_route=false)
89
95
  @sublist.insert(sub.subject, sub)
96
+ broadcast_sub_to_routes(sub) unless is_route
90
97
  end
91
98
 
92
- def unsubscribe(sub)
99
+ def unsubscribe(sub, is_route=false)
93
100
  @sublist.remove(sub.subject, sub)
101
+ broadcast_unsub_to_routes(sub) unless is_route
94
102
  end
95
103
 
96
104
  def deliver_to_subscriber(sub, subject, reply, msg)
@@ -119,7 +127,7 @@ module NATSD #:nodoc: all
119
127
  end
120
128
  end
121
129
 
122
- def route_to_subscribers(subject, reply, msg)
130
+ def route_to_subscribers(subject, reply, msg, is_route=false)
123
131
  qsubs = nil
124
132
 
125
133
  # Allows nil reply to not have extra space
@@ -129,15 +137,28 @@ module NATSD #:nodoc: all
129
137
  @in_msgs += 1
130
138
  @in_bytes += msg.bytesize unless msg.nil?
131
139
 
140
+ # Routes
141
+ routes = nil
142
+
132
143
  @sublist.match(subject).each do |sub|
133
144
  # Skip anyone in the closing state
134
145
  next if sub.conn.closing
135
146
 
136
- unless sub[:qgroup]
137
- deliver_to_subscriber(sub, subject, reply, msg)
138
- else
147
+ # Skip all routes if sourced from another route (1-hop semantics)
148
+ next if (is_route && sub.conn.is_route?)
149
+
150
+ if sub[:qgroup].nil?
151
+ if sub.conn.is_route?
152
+ # Only send messages once over a given route
153
+ routes ||= Set.new
154
+ deliver_to_subscriber(sub, subject, reply, msg) unless routes.include?(sub.conn.remote_rid)
155
+ routes << sub.conn.remote_rid
156
+ else
157
+ deliver_to_subscriber(sub, subject, reply, msg)
158
+ end
159
+ elsif !is_route
139
160
  if NATSD::Server.trace_flag?
140
- trace("Matched queue subscriber", sub[:subject], sub[:qgroup], sub[:sid], sub.conn.client_info)
161
+ trace('Matched queue subscriber', sub[:subject], sub[:qgroup], sub[:sid], sub.conn.client_info)
141
162
  end
142
163
  # Queue this for post processing
143
164
  qsubs ||= Hash.new
@@ -152,7 +173,7 @@ module NATSD #:nodoc: all
152
173
  # Randomly pick a subscriber from the group
153
174
  sub = subs[rand*subs.size]
154
175
  if NATSD::Server.trace_flag?
155
- trace("Selected queue subscriber", sub[:subject], sub[:qgroup], sub[:sid], sub.conn.client_info)
176
+ trace('Selected queue subscriber', sub[:subject], sub[:qgroup], sub[:sid], sub.conn.client_info)
156
177
  end
157
178
  deliver_to_subscriber(sub, subject, reply, msg)
158
179
  end
@@ -167,6 +188,10 @@ module NATSD #:nodoc: all
167
188
  @cid += 1
168
189
  end
169
190
 
191
+ def rid
192
+ @rid += 1
193
+ end
194
+
170
195
  def info_string
171
196
  @info.to_json
172
197
  end
@@ -25,6 +25,7 @@ module NATSD #:nodoc: all
25
25
  @varz[:out_msgs] = out_msgs
26
26
  @varz[:in_bytes] = in_bytes
27
27
  @varz[:out_bytes] = out_bytes
28
+ @varz[:routes] = num_routes
28
29
  @last_varz_update = Time.now.to_f
29
30
  varz
30
31
  end
data/nats.gemspec CHANGED
@@ -16,10 +16,10 @@ spec = Gem::Specification.new do |s|
16
16
  s.authors = ['Derek Collison']
17
17
  s.email = ['derek.collison@gmail.com']
18
18
 
19
- s.add_dependency('eventmachine', '= 0.12.10')
20
- s.add_dependency('json_pure', '>= 1.7.3')
21
- s.add_dependency('daemons', '>= 1.1.5')
22
- s.add_dependency('thin', '>= 1.4.1')
19
+ s.add_dependency('eventmachine', '>= 1.0.3')
20
+ s.add_dependency('json_pure', '>= 1.8.0')
21
+ s.add_dependency('daemons', '>= 1.1.9')
22
+ s.add_dependency('thin', '>= 1.5.0')
23
23
 
24
24
  s.require_paths = ['lib']
25
25
  s.bindir = 'bin'
@@ -44,6 +44,8 @@ spec = Gem::Specification.new do |s|
44
44
  lib/nats/server.rb
45
45
  lib/nats/server/server.rb
46
46
  lib/nats/server/connection.rb
47
+ lib/nats/server/cluster.rb
48
+ lib/nats/server/route.rb
47
49
  lib/nats/server/options.rb
48
50
  lib/nats/server/sublist.rb
49
51
  lib/nats/server/const.rb
metadata CHANGED
@@ -1,60 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.28
5
- prerelease:
4
+ version: 0.5.0.beta.12
6
5
  platform: ruby
7
6
  authors:
8
7
  - Derek Collison
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-22 00:00:00.000000000 Z
11
+ date: 2013-10-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: eventmachine
16
- requirement: &70321680098440 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - =
17
+ - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
- version: 0.12.10
19
+ version: 1.0.3
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70321680098440
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.3
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: json_pure
27
- requirement: &70321680097320 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ! '>='
31
32
  - !ruby/object:Gem::Version
32
- version: 1.7.3
33
+ version: 1.8.0
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70321680097320
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.8.0
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: daemons
38
- requirement: &70321680096000 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ! '>='
42
46
  - !ruby/object:Gem::Version
43
- version: 1.1.5
47
+ version: 1.1.9
44
48
  type: :runtime
45
49
  prerelease: false
46
- version_requirements: *70321680096000
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.9
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: thin
49
- requirement: &70321680095100 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
- version: 1.4.1
61
+ version: 1.5.0
55
62
  type: :runtime
56
63
  prerelease: false
57
- version_requirements: *70321680095100
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.5.0
58
69
  description: A lightweight cloud messaging system.
59
70
  email:
60
71
  - derek.collison@gmail.com
@@ -86,6 +97,8 @@ files:
86
97
  - lib/nats/server.rb
87
98
  - lib/nats/server/server.rb
88
99
  - lib/nats/server/connection.rb
100
+ - lib/nats/server/cluster.rb
101
+ - lib/nats/server/route.rb
89
102
  - lib/nats/server/options.rb
90
103
  - lib/nats/server/sublist.rb
91
104
  - lib/nats/server/const.rb
@@ -94,26 +107,25 @@ files:
94
107
  - lib/nats/server/connz.rb
95
108
  homepage: http://github.com/derekcollison/nats
96
109
  licenses: []
110
+ metadata: {}
97
111
  post_install_message:
98
112
  rdoc_options: []
99
113
  require_paths:
100
114
  - lib
101
115
  required_ruby_version: !ruby/object:Gem::Requirement
102
- none: false
103
116
  requirements:
104
117
  - - ! '>='
105
118
  - !ruby/object:Gem::Version
106
119
  version: '0'
107
120
  required_rubygems_version: !ruby/object:Gem::Requirement
108
- none: false
109
121
  requirements:
110
- - - ! '>='
122
+ - - ! '>'
111
123
  - !ruby/object:Gem::Version
112
- version: '0'
124
+ version: 1.3.1
113
125
  requirements: []
114
126
  rubyforge_project:
115
- rubygems_version: 1.8.10
127
+ rubygems_version: 2.1.5
116
128
  signing_key:
117
- specification_version: 3
129
+ specification_version: 4
118
130
  summary: A lightweight cloud messaging system.
119
131
  test_files: []