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.
- checksums.yaml +15 -0
- data/HISTORY.md +16 -0
- data/README.md +8 -5
- data/bin/nats-queue +14 -5
- data/bin/nats-request +12 -3
- data/bin/nats-sub +13 -5
- data/lib/nats/client.rb +189 -35
- data/lib/nats/server.rb +27 -4
- data/lib/nats/server/cluster.rb +102 -0
- data/lib/nats/server/connection.rb +47 -17
- data/lib/nats/server/connz.rb +0 -2
- data/lib/nats/server/const.rb +14 -2
- data/lib/nats/server/options.rb +19 -2
- data/lib/nats/server/route.rb +279 -0
- data/lib/nats/server/server.rb +35 -10
- data/lib/nats/server/varz.rb +1 -0
- data/nats.gemspec +6 -4
- metadata +38 -26
data/lib/nats/server/server.rb
CHANGED
@@ -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
|
-
|
137
|
-
|
138
|
-
|
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(
|
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(
|
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
|
data/lib/nats/server/varz.rb
CHANGED
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', '
|
20
|
-
s.add_dependency('json_pure', '>= 1.
|
21
|
-
s.add_dependency('daemons', '>= 1.1.
|
22
|
-
s.add_dependency('thin', '>= 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.
|
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:
|
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:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
19
|
+
version: 1.0.3
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
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:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
31
|
- - ! '>='
|
31
32
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.
|
33
|
+
version: 1.8.0
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
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:
|
39
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
40
44
|
requirements:
|
41
45
|
- - ! '>='
|
42
46
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.1.
|
47
|
+
version: 1.1.9
|
44
48
|
type: :runtime
|
45
49
|
prerelease: false
|
46
|
-
version_requirements:
|
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:
|
50
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
51
58
|
requirements:
|
52
59
|
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
61
|
+
version: 1.5.0
|
55
62
|
type: :runtime
|
56
63
|
prerelease: false
|
57
|
-
version_requirements:
|
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:
|
124
|
+
version: 1.3.1
|
113
125
|
requirements: []
|
114
126
|
rubyforge_project:
|
115
|
-
rubygems_version: 1.
|
127
|
+
rubygems_version: 2.1.5
|
116
128
|
signing_key:
|
117
|
-
specification_version:
|
129
|
+
specification_version: 4
|
118
130
|
summary: A lightweight cloud messaging system.
|
119
131
|
test_files: []
|