protobuf-nats 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -0
- data/ext/jars/jnats-1.1-SNAPSHOT.jar +0 -0
- data/lib/protobuf/nats/client.rb +34 -3
- data/lib/protobuf/nats/config.rb +3 -1
- data/lib/protobuf/nats/errors.rb +14 -0
- data/lib/protobuf/nats/jnats.rb +6 -2
- data/lib/protobuf/nats/server.rb +13 -5
- data/lib/protobuf/nats/version.rb +1 -1
- data/lib/protobuf/nats.rb +23 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28a6d2646c7aa30566ecf3042f164df413453b6f
|
4
|
+
data.tar.gz: e0f1fc04823c3da16ec32eb8c17f49ae5d8a73c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fefcb0855bd3467316bcfff911585f09b57a93d93bd6eeca5fff07f15a64da5bf80939553a5650b33f2f2edf5654406c6790b251aa789ccef1a23f3b8d63571
|
7
|
+
data.tar.gz: c4bb2859a7082516118805e5232b89218c668a813b03b7d936b972fc91cd948eb67dee10d77759904f934a91325030b5f7979eb9e1453df83d2b4913d3a01cc4
|
data/README.md
CHANGED
@@ -21,6 +21,22 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
## Configuring
|
23
23
|
|
24
|
+
### Environment Variables
|
25
|
+
|
26
|
+
You can also use the following environment variables to tune parameters:
|
27
|
+
|
28
|
+
`PB_NATS_SERVER_MAX_QUEUE_SIZE` - The size of the queue in front of your thread pool (default: thread count passed to CLI)
|
29
|
+
|
30
|
+
`PB_NATS_CLIENT_ACK_TIMEOUT` - Seconds to wait for an ACK from the rpc server (default: 5 seconds)
|
31
|
+
|
32
|
+
`PB_NATS_CLIENT_RESPONSE_TIMEOUT` - Seconds to wait for a non-ACK response from the rpc server (default: 60 seconds)
|
33
|
+
|
34
|
+
`PB_NATS_CLIENT_RECONNECT_DELAY` - If we detect a reconnect delay, we will wait this many seconds (default: the ACK timeout)
|
35
|
+
|
36
|
+
`PROTOBUF_NATS_CONFIG_PATH` - Custom path to the config yaml (default: "config/protobuf_nats.yml")
|
37
|
+
|
38
|
+
### YAML Config
|
39
|
+
|
24
40
|
The client and server are configured via environment variables defined in the `pure-ruby-nats` gem. However, there are a
|
25
41
|
few params which cannot be set: `servers`, `uses_tls` and `connect_timeout`, so those my be defined in a yml file.
|
26
42
|
|
@@ -36,9 +52,11 @@ An example config looks like this:
|
|
36
52
|
- "nats://127.0.0.1:4222"
|
37
53
|
- "nats://127.0.0.1:4223"
|
38
54
|
- "nats://127.0.0.1:4224"
|
55
|
+
max_reconnect_attempts: 500
|
39
56
|
uses_tls: true
|
40
57
|
tls_client_cert: "/path/to/client-cert.pem"
|
41
58
|
tls_client_key: "/path/to/client-key.pem"
|
59
|
+
tls_ca_cert: "/path/to/ca.pem"
|
42
60
|
connect_timeout: 2
|
43
61
|
```
|
44
62
|
|
Binary file
|
data/lib/protobuf/nats/client.rb
CHANGED
@@ -40,15 +40,48 @@ module Protobuf
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
def ack_timeout
|
44
|
+
@ack_timeout ||= if ::ENV.key?("PB_NATS_CLIENT_ACK_TIMEOUT")
|
45
|
+
::ENV["PB_NATS_CLIENT_ACK_TIMEOUT"].to_i
|
46
|
+
else
|
47
|
+
5
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def reconnect_delay
|
52
|
+
@reconnect_delay ||= if ::ENV.key?("PB_NATS_CLIENT_RECONNECT_DELAY")
|
53
|
+
::ENV["PB_NATS_CLIENT_RECONNECT_DELAY"].to_i
|
54
|
+
else
|
55
|
+
ack_timeout
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def response_timeout
|
60
|
+
@response_timeout ||= if ::ENV.key?("PB_NATS_CLIENT_RESPONSE_TIMEOUT")
|
61
|
+
::ENV["PB_NATS_CLIENT_RESPONSE_TIMEOUT"].to_i
|
62
|
+
else
|
63
|
+
60
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
43
67
|
def send_request
|
44
68
|
failure_handler do
|
45
69
|
begin
|
46
70
|
retries ||= 3
|
47
71
|
|
48
72
|
setup_connection
|
49
|
-
request_options = {:timeout =>
|
73
|
+
request_options = {:timeout => response_timeout, :ack_timeout => ack_timeout}
|
50
74
|
@response_data = nats_request_with_two_responses(cached_subscription_key, @request_data, request_options)
|
51
75
|
parse_response
|
76
|
+
rescue ::Protobuf::Nats::Errors::IOException => error
|
77
|
+
::Protobuf::Nats.log_error(error)
|
78
|
+
|
79
|
+
delay = reconnect_delay
|
80
|
+
logger.warn "An IOException was raised. We are going to sleep for #{delay} seconds."
|
81
|
+
sleep delay
|
82
|
+
|
83
|
+
retry if (retries -= 1) > 0
|
84
|
+
raise
|
52
85
|
rescue ::NATS::IO::Timeout
|
53
86
|
# Nats response timeout.
|
54
87
|
retry if (retries -= 1) > 0
|
@@ -112,8 +145,6 @@ module Protobuf
|
|
112
145
|
response
|
113
146
|
ensure
|
114
147
|
# Ensure we don't leave a subscriptiosn sitting around.
|
115
|
-
# This also cleans up memory. It's a no-op if the subscription
|
116
|
-
# is already cleaned up.
|
117
148
|
nats.unsubscribe(sub)
|
118
149
|
end
|
119
150
|
|
data/lib/protobuf/nats/config.rb
CHANGED
@@ -4,12 +4,13 @@ require "yaml"
|
|
4
4
|
module Protobuf
|
5
5
|
module Nats
|
6
6
|
class Config
|
7
|
-
attr_accessor :uses_tls, :servers, :connect_timeout, :tls_client_cert, :tls_client_key, :tls_ca_cert
|
7
|
+
attr_accessor :uses_tls, :servers, :connect_timeout, :tls_client_cert, :tls_client_key, :tls_ca_cert, :max_reconnect_attempts
|
8
8
|
|
9
9
|
CONFIG_MUTEX = ::Mutex.new
|
10
10
|
|
11
11
|
DEFAULTS = {
|
12
12
|
:connect_timeout => nil,
|
13
|
+
:max_reconnect_attempts => 60_000,
|
13
14
|
:servers => nil,
|
14
15
|
:tls_client_cert => nil,
|
15
16
|
:tls_client_key => nil,
|
@@ -54,6 +55,7 @@ module Protobuf
|
|
54
55
|
@connection_options ||= begin
|
55
56
|
options = {
|
56
57
|
servers: servers,
|
58
|
+
max_reconnect_attempts: max_reconnect_attempts,
|
57
59
|
uses_tls: uses_tls,
|
58
60
|
tls_client_cert: tls_client_cert,
|
59
61
|
tls_client_key: tls_client_key,
|
data/lib/protobuf/nats/jnats.rb
CHANGED
@@ -39,8 +39,12 @@ module Protobuf
|
|
39
39
|
servers = [servers].flatten.map { |uri_string| java.net.URI.new(uri_string) }
|
40
40
|
connection_factory = ::Java::IoNatsClient::ConnectionFactory.new
|
41
41
|
connection_factory.setServers(servers)
|
42
|
-
|
43
|
-
|
42
|
+
connection_factory.setMaxReconnect(options[:max_reconnect_attempts])
|
43
|
+
|
44
|
+
# Shrink the pending buffer to always raise an error and let the caller retry.
|
45
|
+
if options[:disable_reconnect_buffer]
|
46
|
+
connection_factory.setReconnectBufSize(1)
|
47
|
+
end
|
44
48
|
|
45
49
|
# Setup callbacks
|
46
50
|
connection_factory.setDisconnectedCallback { |event| @on_disconnect_cb.call }
|
data/lib/protobuf/nats/server.rb
CHANGED
@@ -16,14 +16,22 @@ module Protobuf
|
|
16
16
|
@running = true
|
17
17
|
@stopped = false
|
18
18
|
|
19
|
-
@nats = options[:client] || ::Protobuf::Nats::NatsClient.new
|
19
|
+
@nats = @options[:client] || ::Protobuf::Nats::NatsClient.new
|
20
20
|
@nats.connect(::Protobuf::Nats.config.connection_options)
|
21
21
|
|
22
|
-
@thread_pool = ::Protobuf::Nats::ThreadPool.new(options[:threads], :max_queue =>
|
22
|
+
@thread_pool = ::Protobuf::Nats::ThreadPool.new(@options[:threads], :max_queue => max_queue_size)
|
23
23
|
|
24
24
|
@subscriptions = []
|
25
25
|
end
|
26
26
|
|
27
|
+
def max_queue_size
|
28
|
+
if ::ENV.key?("PB_NATS_SERVER_MAX_QUEUE_SIZE")
|
29
|
+
::ENV["PB_NATS_SERVER_MAX_QUEUE_SIZE"].to_i
|
30
|
+
else
|
31
|
+
@options[:threads]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
27
35
|
def service_klasses
|
28
36
|
::Protobuf::Rpc::Service.implemented_services.map(&:safe_constantize)
|
29
37
|
end
|
@@ -68,11 +76,11 @@ module Protobuf
|
|
68
76
|
|
69
77
|
def run
|
70
78
|
nats.on_reconnect do
|
71
|
-
logger.warn "
|
79
|
+
logger.warn "Server NATS connection was reconnected"
|
72
80
|
end
|
73
81
|
|
74
82
|
nats.on_disconnect do
|
75
|
-
logger.warn "
|
83
|
+
logger.warn "Server NATS connection was disconnected"
|
76
84
|
end
|
77
85
|
|
78
86
|
nats.on_error do |error|
|
@@ -80,7 +88,7 @@ module Protobuf
|
|
80
88
|
end
|
81
89
|
|
82
90
|
nats.on_close do
|
83
|
-
logger.warn "NATS connection was closed
|
91
|
+
logger.warn "Server NATS connection was closed"
|
84
92
|
end
|
85
93
|
|
86
94
|
subscribe_to_services
|
data/lib/protobuf/nats.rb
CHANGED
@@ -6,6 +6,7 @@ require "protobuf/rpc/service_directory"
|
|
6
6
|
|
7
7
|
require "nats/io/client"
|
8
8
|
|
9
|
+
require "protobuf/nats/errors"
|
9
10
|
require "protobuf/nats/client"
|
10
11
|
require "protobuf/nats/server"
|
11
12
|
require "protobuf/nats/runner"
|
@@ -53,12 +54,32 @@ module Protobuf
|
|
53
54
|
break true if @client_nats_connection
|
54
55
|
break true if @start_client_nats_connection
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
# Disable publisher pending buffer on reconnect
|
58
|
+
options = config.connection_options.merge(:disable_reconnect_buffer => true)
|
59
|
+
|
60
|
+
begin
|
61
|
+
@client_nats_connection = NatsClient.new
|
62
|
+
@client_nats_connection.connect(options)
|
63
|
+
rescue ::Protobuf::Nats::Errors::IOException
|
64
|
+
@client_nats_connection = nil
|
65
|
+
raise
|
66
|
+
end
|
58
67
|
|
59
68
|
# Ensure we have a valid connection to the NATS server.
|
60
69
|
@client_nats_connection.flush(5)
|
61
70
|
|
71
|
+
@client_nats_connection.on_disconnect do
|
72
|
+
logger.warn("Client NATS connection was disconnected")
|
73
|
+
end
|
74
|
+
|
75
|
+
@client_nats_connection.on_reconnect do
|
76
|
+
logger.warn("Client NATS connection was reconnected")
|
77
|
+
end
|
78
|
+
|
79
|
+
@client_nats_connection.on_close do
|
80
|
+
logger.warn("Client NATS connection was closed")
|
81
|
+
end
|
82
|
+
|
62
83
|
@client_nats_connection.on_error do |error|
|
63
84
|
log_error(error)
|
64
85
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protobuf-nats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Dewitt
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: protobuf
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- lib/protobuf/nats.rb
|
138
138
|
- lib/protobuf/nats/client.rb
|
139
139
|
- lib/protobuf/nats/config.rb
|
140
|
+
- lib/protobuf/nats/errors.rb
|
140
141
|
- lib/protobuf/nats/jnats.rb
|
141
142
|
- lib/protobuf/nats/runner.rb
|
142
143
|
- lib/protobuf/nats/server.rb
|