fastly_nsq 1.16.0 → 1.18.0
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 +4 -4
- data/.env +2 -2
- data/.git-blame-ignore-revs +6 -0
- data/.ruby-version +1 -1
- data/.travis.yml +4 -3
- data/ChangeLog.md +31 -1
- data/Gemfile +8 -8
- data/README.md +84 -6
- data/Rakefile +10 -11
- data/fastly_nsq.gemspec +26 -26
- data/lib/fastly_nsq/cli.rb +43 -50
- data/lib/fastly_nsq/consumer.rb +27 -14
- data/lib/fastly_nsq/feeder.rb +5 -7
- data/lib/fastly_nsq/http/nsqd.rb +28 -28
- data/lib/fastly_nsq/http/nsqlookupd.rb +11 -11
- data/lib/fastly_nsq/http.rb +4 -4
- data/lib/fastly_nsq/launcher.rb +16 -16
- data/lib/fastly_nsq/listener.rb +16 -16
- data/lib/fastly_nsq/manager.rb +13 -12
- data/lib/fastly_nsq/message.rb +4 -4
- data/lib/fastly_nsq/messenger.rb +25 -15
- data/lib/fastly_nsq/new_relic.rb +8 -8
- data/lib/fastly_nsq/priority_queue.rb +2 -2
- data/lib/fastly_nsq/priority_thread_pool.rb +3 -3
- data/lib/fastly_nsq/producer.rb +23 -14
- data/lib/fastly_nsq/safe_thread.rb +1 -1
- data/lib/fastly_nsq/testing.rb +4 -3
- data/lib/fastly_nsq/tls_options.rb +6 -6
- data/lib/fastly_nsq/version.rb +1 -1
- data/lib/fastly_nsq.rb +64 -29
- data/spec/cli_spec.rb +2 -2
- data/spec/consumer_spec.rb +53 -12
- data/spec/fastly_nsq_spec.rb +108 -32
- data/spec/feeder_spec.rb +4 -4
- data/spec/http/nsqd_spec.rb +23 -23
- data/spec/http/nsqlookupd_spec.rb +19 -19
- data/spec/http_spec.rb +22 -22
- data/spec/integration_spec.rb +10 -10
- data/spec/launcher_spec.rb +21 -21
- data/spec/listener_spec.rb +50 -50
- data/spec/manager_spec.rb +27 -27
- data/spec/matchers/delegate.rb +4 -4
- data/spec/message_spec.rb +19 -19
- data/spec/messenger_spec.rb +71 -59
- data/spec/new_relic.rb +27 -27
- data/spec/priority_thread_pool_spec.rb +2 -2
- data/spec/producer_spec.rb +70 -31
- data/spec/spec_helper.rb +12 -12
- data/spec/support/http.rb +2 -2
- data/spec/support/webmock.rb +1 -1
- data/spec/testing_spec.rb +12 -12
- data/spec/tls_options_spec.rb +47 -47
- metadata +10 -11
- data/.rubocop.yml +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c499298a1a690208afc03693e6bdae6730408f7e61544033f5b6fdbab778364
|
4
|
+
data.tar.gz: 3c346c1bcb3a7d44508144beb14b91edad7f8bcb2cb07e35cd8a301a67069e57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b350e9fd2f0d2c993aa3d3a84b24935137faa7cbf65967f0342434c108e7b13213b3dd45b753c2e73de3e487729f2038a8a07045ef1987c1d3e5d55d78797ee3
|
7
|
+
data.tar.gz: a2f4494d86c8d5d37db0ed59e149edebfecee56888971cc2e1cfecff5d88fbcbd05e65a72cfe5d1d1e6d8758f88296a20b877d43a8ebed06d663519070e6f7fd
|
data/.env
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.0.3
|
data/.travis.yml
CHANGED
@@ -2,14 +2,15 @@ language: ruby
|
|
2
2
|
cache: bundler
|
3
3
|
sudo: false
|
4
4
|
rvm:
|
5
|
-
- 2.
|
6
|
-
- 2.
|
7
|
-
-
|
5
|
+
- 2.6.9
|
6
|
+
- 2.7.5
|
7
|
+
- 3.0.3
|
8
8
|
script:
|
9
9
|
- bundle exec rake
|
10
10
|
services:
|
11
11
|
- docker
|
12
12
|
before_install:
|
13
|
+
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
13
14
|
- docker-compose up -d
|
14
15
|
before_script:
|
15
16
|
- gem update --system
|
data/ChangeLog.md
CHANGED
@@ -1,7 +1,37 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [v1.
|
3
|
+
## [v1.18.0](https://github.com/fastly/fastly_nsq/tree/v1.18.0) (2022-03-04)
|
4
|
+
[Full Changelog](https://github.com/fastly/fastly_nsq/compare/v1.17.1...v1.18.0)
|
4
5
|
|
6
|
+
**Merged pull requests:**
|
7
|
+
|
8
|
+
- Configurable NSQDs for Consumers and Producers [\#105](https://github.com/fastly/fastly_nsq/pull/105)
|
9
|
+
|
10
|
+
## [v1.17.1](https://github.com/fastly/fastly_nsq/tree/v1.17.1) (2022-02-23)
|
11
|
+
[Full Changelog](https://github.com/fastly/fastly_nsq/compare/v1.17.0...v1.17.1)
|
12
|
+
|
13
|
+
**Merged pull requests:**
|
14
|
+
|
15
|
+
- Use standardrb for style and formatting [\#104](https://github.com/fastly/fastly_nsq/pull/104)
|
16
|
+
|
17
|
+
## [v1.17.0](https://github.com/fastly/fastly_nsq/tree/v1.17.0) (2021-02-11)
|
18
|
+
[Full Changelog](https://github.com/fastly/fastly_nsq/compare/v1.16.0...v1.17.0)
|
19
|
+
|
20
|
+
**Merged pull requests:**
|
21
|
+
|
22
|
+
- Support for arbitary sent\_at Time [\#99](https://github.com/fastly/fastly_nsq/pull/99) ([leklund](https://github.com/leklund))
|
23
|
+
- remove version pin on rake for development [\#97](https://github.com/fastly/fastly_nsq/pull/97) ([leklund](https://github.com/leklund))
|
24
|
+
- Ignore from Humane Registry [\#96](https://github.com/fastly/fastly_nsq/pull/96) ([leklund](https://github.com/leklund))
|
25
|
+
|
26
|
+
## [v1.16.0](https://github.com/fastly/fastly_nsq/tree/v1.16.0) (2019-08-16)
|
27
|
+
[Full Changelog](https://github.com/fastly/fastly_nsq/compare/v1.15.0...v1.16.0)
|
28
|
+
|
29
|
+
**Merged pull requests:**
|
30
|
+
|
31
|
+
- Log the internal NSQ id [\#95](https://github.com/fastly/fastly_nsq/pull/95) ([leklund](https://github.com/leklund))
|
32
|
+
- Consumer still attempts connections in Test mode [\#93](https://github.com/fastly/fastly_nsq/pull/93) ([alieander](https://github.com/alieander))
|
33
|
+
|
34
|
+
## [v1.15.0](https://github.com/fastly/fastly_nsq/tree/v1.15.0) (2018-10-05)
|
5
35
|
[Full Changelog](https://github.com/fastly/fastly_nsq/compare/v1.14.0...v1.15.0)
|
6
36
|
|
7
37
|
**Merged pull requests:**
|
data/Gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
source
|
3
|
+
source "https://rubygems.org"
|
4
4
|
|
5
5
|
gemspec
|
6
6
|
|
7
|
-
gem
|
8
|
-
gem
|
9
|
-
gem
|
10
|
-
gem
|
11
|
-
gem
|
12
|
-
gem
|
13
|
-
gem
|
7
|
+
gem "bundler-audit"
|
8
|
+
gem "newrelic_rpm", require: false
|
9
|
+
gem "overcommit", "~> 0.32.0"
|
10
|
+
gem "rake"
|
11
|
+
gem "rdoc"
|
12
|
+
gem "standard"
|
13
|
+
gem "rubygems-tasks", "~> 0.2"
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# fastly_nsq [](https://travis-ci.com/fastly/fastly_nsq)
|
2
2
|
|
3
3
|
NSQ adapter and testing objects
|
4
4
|
for using the NSQ messaging system
|
@@ -12,9 +12,9 @@ We also include fakes
|
|
12
12
|
to make testing easier.
|
13
13
|
|
14
14
|
This library is dependent
|
15
|
-
on the [`nsq-ruby`] gem.
|
15
|
+
on the [`nsq-ruby-fastly`] gem.
|
16
16
|
|
17
|
-
[`nsq-ruby`]: https://github.com/
|
17
|
+
[`nsq-ruby-fastly`]: https://github.com/fastly/nsq-ruby
|
18
18
|
|
19
19
|
Please use [GitHub Issues] to report bugs.
|
20
20
|
|
@@ -34,6 +34,65 @@ and `bundle install`.
|
|
34
34
|
|
35
35
|
## Usage
|
36
36
|
|
37
|
+
### Connections
|
38
|
+
|
39
|
+
NSQD cconnections can be discovered via nsqlookupd's or
|
40
|
+
specified explicity for consumers and producers.
|
41
|
+
|
42
|
+
#### Using nsqlookup:
|
43
|
+
|
44
|
+
Set the ENV variable to a comma sepearated string of lookups:
|
45
|
+
|
46
|
+
```
|
47
|
+
ENV['NSQLOOKUPD_HTTP_ADDRESS'] = "lookup01:1234,lookup01:1234"
|
48
|
+
```
|
49
|
+
|
50
|
+
Or configure them directly:
|
51
|
+
|
52
|
+
```
|
53
|
+
FastlyNsq.configure do |config|
|
54
|
+
config.lookupd_http_addresses = ["lookup01:1234", "lookup02:1234"]
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
#### Using nsqd directly:
|
59
|
+
|
60
|
+
NSQD connections can be specified for consumers and producers. Being able to set
|
61
|
+
different sets for consumers and producers facilitates removing and adding new instances
|
62
|
+
without downtime.
|
63
|
+
|
64
|
+
Set the following ENV variables to a comma sepearted string of nsqds:
|
65
|
+
|
66
|
+
```
|
67
|
+
ENV['NSQD_CONSUMERS']="nsqd01:4150,nsd02:4150"
|
68
|
+
ENV['NSQD_PRODUCERS']="nsqd01:4150,nsd02:4150"
|
69
|
+
```
|
70
|
+
|
71
|
+
Or configure them directly:
|
72
|
+
|
73
|
+
```
|
74
|
+
FastlyNsq.configure do |config|
|
75
|
+
config.consumer_nsqds = ["nsqd01:4150", "nsqd02:4150"]
|
76
|
+
config.producer_nsqds = ["nsqd01:4150", "nsqd02:4150"]
|
77
|
+
end
|
78
|
+
```
|
79
|
+
|
80
|
+
### Connection Priority
|
81
|
+
|
82
|
+
When `FastlyNsq.consumer_nsqds` or `FastlyNsq.producer_nsqds` are set they
|
83
|
+
will be used instead of `FastlyNsq.lookupd_http_addresses`.
|
84
|
+
|
85
|
+
### TLS
|
86
|
+
|
87
|
+
Set the following ENV variables to enable TLS support:
|
88
|
+
|
89
|
+
```
|
90
|
+
NSQ_SSL_KEY
|
91
|
+
NSQ_SSL_CERTIFICATE
|
92
|
+
NSQ_SSL_CA_CERTIFICATE
|
93
|
+
NSQ_SSL_VERIFY_MODE (optional)
|
94
|
+
```
|
95
|
+
|
37
96
|
### `FastlyNsq::Producer`
|
38
97
|
|
39
98
|
This is a class
|
@@ -50,7 +109,6 @@ message_data = {
|
|
50
109
|
}
|
51
110
|
|
52
111
|
producer = FastlyNsq::Producer.new(
|
53
|
-
nsqd: ENV.fetch('NSQD_TCP_ADDRESS'),
|
54
112
|
topic: topic,
|
55
113
|
)
|
56
114
|
|
@@ -281,6 +339,22 @@ expect(some_result)
|
|
281
339
|
|
282
340
|
## Configuration
|
283
341
|
|
342
|
+
See the [documentation](https://www.rubydoc.info/gems/fastly_nsq/FastlyNsq) for additional settings
|
343
|
+
|
344
|
+
Example:
|
345
|
+
|
346
|
+
```
|
347
|
+
FastlyNsq.configure do |config|
|
348
|
+
config.channel = "z"
|
349
|
+
config.producer_nsqds = ["nsqd01:4150", "nsqd02:4150"]
|
350
|
+
config.lookupd_http_addresses = ["lookupd01:4161", "lookupd02:4161"]
|
351
|
+
config.logger = Logger.new(STDOUT)
|
352
|
+
config.max_attempts = 10
|
353
|
+
config.max_req_timeout = 10_000
|
354
|
+
config.max_processing_pool_threads = 42
|
355
|
+
end
|
356
|
+
```
|
357
|
+
|
284
358
|
### Environment Variables
|
285
359
|
|
286
360
|
The URLs for the various
|
@@ -293,10 +367,10 @@ stock NSQ on OS X,
|
|
293
367
|
installed via Homebrew:
|
294
368
|
|
295
369
|
```shell
|
296
|
-
NSQD_TCP_ADDRESS='127.0.0.1:4150'
|
297
370
|
NSQD_HTTP_ADDRESS='127.0.0.1:4151'
|
298
|
-
NSQLOOKUPD_TCP_ADDRESS='127.0.0.1:4160'
|
299
371
|
NSQLOOKUPD_HTTP_ADDRESS='127.0.0.1:4161, 10.1.1.101:4161'
|
372
|
+
NSQD_CONSUMERS='127.0.0.1:4150'
|
373
|
+
NSQD_PRODUCERS='127.0.0.1:4150'
|
300
374
|
```
|
301
375
|
|
302
376
|
See the [`.sample.env`](examples/.sample.env) file
|
@@ -334,3 +408,7 @@ You will still need the `ENV` variables as defined above.
|
|
334
408
|
Copyright (c) 2016 [Fastly, Inc](https://fastly.com) under an MIT license.
|
335
409
|
|
336
410
|
See [LICENSE.txt](LICENSE.txt) for details.
|
411
|
+
|
412
|
+
# Metadata
|
413
|
+
|
414
|
+
- Ignore
|
data/Rakefile
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rubygems"
|
4
4
|
|
5
5
|
begin
|
6
|
-
require
|
6
|
+
require "bundler/setup"
|
7
7
|
rescue LoadError => e
|
8
8
|
abort e.message
|
9
9
|
end
|
10
10
|
|
11
|
-
require
|
11
|
+
require "rake"
|
12
12
|
|
13
|
-
require
|
13
|
+
require "rubygems/tasks"
|
14
14
|
Gem::Tasks.new
|
15
15
|
|
16
|
-
require
|
16
|
+
require "rdoc/task"
|
17
17
|
RDoc::Task.new
|
18
18
|
task doc: :rdoc
|
19
19
|
|
20
|
-
require
|
20
|
+
require "rspec/core/rake_task"
|
21
21
|
RSpec::Core::RakeTask.new(:spec)
|
22
22
|
|
23
|
-
require
|
23
|
+
require "bundler/audit/cli"
|
24
24
|
namespace :bundler do
|
25
|
-
desc
|
25
|
+
desc "Updates the ruby-advisory-db and runs audit"
|
26
26
|
task :audit do
|
27
27
|
%w[update check].each do |command|
|
28
28
|
Bundler::Audit::CLI.start [command]
|
@@ -30,8 +30,7 @@ namespace :bundler do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
require
|
34
|
-
RuboCop::RakeTask.new
|
33
|
+
require "standard/rake"
|
35
34
|
|
36
35
|
task(:default).clear
|
37
|
-
task default: [
|
36
|
+
task default: ["spec", "standard", "bundler:audit"]
|
data/fastly_nsq.gemspec
CHANGED
@@ -1,36 +1,36 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require "fastly_nsq/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |gem|
|
8
|
-
gem.name
|
9
|
-
gem.version
|
10
|
-
gem.summary
|
11
|
-
gem.description
|
12
|
-
gem.license
|
13
|
-
gem.authors
|
14
|
-
gem.email
|
15
|
-
gem.homepage
|
8
|
+
gem.name = "fastly_nsq"
|
9
|
+
gem.version = FastlyNsq::VERSION
|
10
|
+
gem.summary = "Fastly NSQ Adapter"
|
11
|
+
gem.description = "Helper classes for Fastly's NSQ Services"
|
12
|
+
gem.license = "MIT"
|
13
|
+
gem.authors = ["Tommy O'Neil", "Adarsh Pandit", "Joshua Wehner", "Lukas Eklund", "Josh Lane", "Hassan Shahid"]
|
14
|
+
gem.email = "tommy@fastly.com"
|
15
|
+
gem.homepage = "https://github.com/fastly/fastly_nsq"
|
16
16
|
|
17
|
-
gem.files
|
17
|
+
gem.files = `git ls-files`.split("\n")
|
18
18
|
|
19
|
-
gem.executables
|
20
|
-
gem.test_files
|
21
|
-
gem.require_paths = [
|
19
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
20
|
+
gem.test_files = gem.files.grep(%r{^(test|features)/})
|
21
|
+
gem.require_paths = ["lib"]
|
22
22
|
|
23
|
-
gem.add_development_dependency
|
24
|
-
gem.add_development_dependency
|
25
|
-
gem.add_development_dependency
|
26
|
-
gem.add_development_dependency
|
27
|
-
gem.add_development_dependency
|
28
|
-
gem.add_development_dependency
|
29
|
-
gem.add_development_dependency
|
30
|
-
gem.add_development_dependency
|
31
|
-
gem.add_development_dependency
|
23
|
+
gem.add_development_dependency "awesome_print", "~> 1.6"
|
24
|
+
gem.add_development_dependency "bundler"
|
25
|
+
gem.add_development_dependency "dotenv"
|
26
|
+
gem.add_development_dependency "pry-byebug", "~> 3.3"
|
27
|
+
gem.add_development_dependency "rspec", "~> 3.4"
|
28
|
+
gem.add_development_dependency "rspec-eventually", "0.2"
|
29
|
+
gem.add_development_dependency "timecop"
|
30
|
+
gem.add_development_dependency "webmock", "~> 3.0"
|
31
|
+
gem.add_development_dependency "yard"
|
32
32
|
|
33
|
-
gem.add_dependency
|
34
|
-
gem.add_dependency
|
35
|
-
gem.add_dependency
|
33
|
+
gem.add_dependency "concurrent-ruby", "~> 1.0"
|
34
|
+
gem.add_dependency "nsq-ruby-fastly", "~> 2.4"
|
35
|
+
gem.add_dependency "priority_queue_cxx", "~> 0.3"
|
36
36
|
end
|
data/lib/fastly_nsq/cli.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Metrics/ClassLength
|
4
3
|
$stdout.sync = true
|
5
4
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
5
|
+
require "fastly_nsq"
|
6
|
+
require "fastly_nsq/launcher"
|
7
|
+
require "fastly_nsq/manager"
|
8
|
+
require "fileutils"
|
9
|
+
require "optparse"
|
10
|
+
require "singleton"
|
12
11
|
|
13
12
|
# Provides functionality to support running FastlyNsq as a command line
|
14
13
|
# application that listens and processes NSQ messages.
|
@@ -44,26 +43,24 @@ class FastlyNsq::CLI
|
|
44
43
|
|
45
44
|
read_loop
|
46
45
|
rescue Interrupt
|
47
|
-
FastlyNsq.logger.info
|
46
|
+
FastlyNsq.logger.info "Shutting down"
|
48
47
|
launcher.stop
|
49
48
|
# Explicitly exit so busy Processor threads can't block
|
50
49
|
# process shutdown.
|
51
|
-
FastlyNsq.logger.info
|
50
|
+
FastlyNsq.logger.info "Bye!"
|
52
51
|
exit(0)
|
53
52
|
end
|
54
53
|
|
55
54
|
private
|
56
55
|
|
57
56
|
def launcher
|
58
|
-
@launcher ||= FastlyNsq::Launcher.new(options)
|
57
|
+
@launcher ||= FastlyNsq::Launcher.new(**options)
|
59
58
|
end
|
60
59
|
|
61
60
|
def read_loop
|
62
61
|
trapped_read_io = trap_signals
|
63
|
-
|
64
|
-
|
65
|
-
break unless readable_io
|
66
|
-
signal = readable_io.first[0].gets.strip
|
62
|
+
while trapped_read_io.wait_readable
|
63
|
+
signal = trapped_read_io.gets.strip
|
67
64
|
handle_signal signal
|
68
65
|
end
|
69
66
|
end
|
@@ -72,51 +69,51 @@ class FastlyNsq::CLI
|
|
72
69
|
boot_rails
|
73
70
|
require options[:require] if options[:require]
|
74
71
|
FastlyNsq.logger.info "Running in #{RUBY_DESCRIPTION}"
|
75
|
-
FastlyNsq.logger.info
|
72
|
+
FastlyNsq.logger.info "Starting processing, hit Ctrl-C to stop" unless options[:daemon]
|
76
73
|
end
|
77
74
|
|
78
75
|
def boot_rails
|
79
|
-
return unless ENV[
|
76
|
+
return unless ENV["RAILS_ENV"]
|
80
77
|
|
81
|
-
require
|
82
|
-
require File.expand_path(
|
83
|
-
require File.expand_path(
|
78
|
+
require "rails"
|
79
|
+
require File.expand_path("./config/application.rb")
|
80
|
+
require File.expand_path("./config/environment.rb")
|
84
81
|
end
|
85
82
|
|
86
83
|
def parse(args)
|
87
84
|
opts = {}
|
88
85
|
|
89
86
|
@parser = OptionParser.new do |o|
|
90
|
-
o.on
|
87
|
+
o.on "-c", "--concurrency COUNT", "Number of threads used to process messages" do |arg|
|
91
88
|
opts[:max_threads] = arg
|
92
89
|
end
|
93
90
|
|
94
|
-
o.on
|
91
|
+
o.on "-d", "--daemon", "Daemonize process" do |arg|
|
95
92
|
opts[:daemonize] = arg
|
96
93
|
end
|
97
94
|
|
98
|
-
o.on
|
95
|
+
o.on "-L", "--logfile PATH", "path to writable logfile" do |arg|
|
99
96
|
opts[:logfile] = arg
|
100
97
|
end
|
101
98
|
|
102
|
-
o.on
|
99
|
+
o.on "-P", "--pidfile PATH", "path to pidfile" do |arg|
|
103
100
|
opts[:pidfile] = arg
|
104
101
|
end
|
105
102
|
|
106
|
-
o.on
|
103
|
+
o.on "-r", "--require [PATH|DIR]", "Location of message_processor definition" do |arg|
|
107
104
|
opts[:require] = arg
|
108
105
|
end
|
109
106
|
|
110
|
-
o.on
|
107
|
+
o.on "-v", "--verbose", "enable verbose logging output" do |arg|
|
111
108
|
opts[:verbose] = arg
|
112
109
|
end
|
113
110
|
|
114
|
-
o.on
|
111
|
+
o.on "-t", "--timeout SECONDS", "shutdown deadline timeout" do |arg|
|
115
112
|
opts[:timeout] = arg
|
116
113
|
end
|
117
114
|
end
|
118
115
|
|
119
|
-
@parser.banner =
|
116
|
+
@parser.banner = "fastly_nsq [options]"
|
120
117
|
@parser.parse!(args)
|
121
118
|
|
122
119
|
@options = opts
|
@@ -171,13 +168,11 @@ class FastlyNsq::CLI
|
|
171
168
|
sigs = %w[INT TERM TTIN USR1]
|
172
169
|
|
173
170
|
sigs.each do |sig|
|
174
|
-
|
175
|
-
|
176
|
-
self_write.puts(sig)
|
177
|
-
end
|
178
|
-
rescue ArgumentError
|
179
|
-
puts "Signal #{sig} not supported"
|
171
|
+
trap sig do
|
172
|
+
self_write.puts(sig)
|
180
173
|
end
|
174
|
+
rescue ArgumentError
|
175
|
+
puts "Signal #{sig} not supported"
|
181
176
|
end
|
182
177
|
self_read
|
183
178
|
end
|
@@ -185,28 +180,28 @@ class FastlyNsq::CLI
|
|
185
180
|
def handle_signal(sig)
|
186
181
|
FastlyNsq.logger.debug "Got #{sig} signal"
|
187
182
|
case sig
|
188
|
-
when
|
183
|
+
when "INT"
|
189
184
|
# Handle Ctrl-C in JRuby like MRI
|
190
185
|
# http://jira.codehaus.org/browse/JRUBY-4637
|
191
186
|
raise Interrupt
|
192
|
-
when
|
187
|
+
when "TERM"
|
193
188
|
# Heroku sends TERM and then waits 10 seconds for process to exit.
|
194
189
|
raise Interrupt
|
195
|
-
when
|
196
|
-
FastlyNsq.logger.info
|
190
|
+
when "USR1"
|
191
|
+
FastlyNsq.logger.info "Received USR1, no longer accepting new work"
|
197
192
|
launcher.stop_listeners
|
198
|
-
when
|
193
|
+
when "TTIN"
|
199
194
|
handle_ttin
|
200
195
|
end
|
201
196
|
end
|
202
197
|
|
203
198
|
def handle_ttin
|
204
199
|
Thread.list.each do |thread|
|
205
|
-
FastlyNsq.logger.warn "Thread TID-#{thread.object_id.to_s(36)} #{thread[
|
200
|
+
FastlyNsq.logger.warn "Thread TID-#{thread.object_id.to_s(36)} #{thread["fastly_nsq_label"]}"
|
206
201
|
if thread.backtrace
|
207
202
|
FastlyNsq.logger.warn thread.backtrace.join("\n")
|
208
203
|
else
|
209
|
-
FastlyNsq.logger.warn
|
204
|
+
FastlyNsq.logger.warn "<no backtrace available>"
|
210
205
|
end
|
211
206
|
end
|
212
207
|
end
|
@@ -224,26 +219,24 @@ class FastlyNsq::CLI
|
|
224
219
|
reopen(files_to_reopen)
|
225
220
|
|
226
221
|
[$stdout, $stderr].each do |io|
|
227
|
-
File.open(options.fetch(:logfile,
|
222
|
+
File.open(options.fetch(:logfile, "/dev/null"), "ab") do |f|
|
228
223
|
io.reopen(f)
|
229
224
|
end
|
230
225
|
io.sync = true
|
231
226
|
end
|
232
|
-
$stdin.reopen(
|
227
|
+
$stdin.reopen("/dev/null")
|
233
228
|
|
234
229
|
setup_logger
|
235
230
|
end
|
236
231
|
|
237
232
|
def reopen(files)
|
238
233
|
files.each do |file|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
FastlyNsq.logger.error "Non IOError reopening file: #{e.message}"
|
246
|
-
end
|
234
|
+
file.reopen file.path, "a+"
|
235
|
+
file.sync = true
|
236
|
+
rescue IOError => e
|
237
|
+
FastlyNsq.logger.warn "IOError reopening file: #{e.message}"
|
238
|
+
rescue => e
|
239
|
+
FastlyNsq.logger.error "Non IOError reopening file: #{e.message}"
|
247
240
|
end
|
248
241
|
end
|
249
242
|
|
data/lib/fastly_nsq/consumer.rb
CHANGED
@@ -61,6 +61,9 @@ class FastlyNsq::Consumer
|
|
61
61
|
##
|
62
62
|
# Create a FastlyNsq::Consumer
|
63
63
|
#
|
64
|
+
# Will connect to NSQDs in this priority: 1. direct from FastlyNsq.consumer_nsqds 2. discovered via FastlyNsq.lookupd_http_addresses.
|
65
|
+
# If both `consumer_nsqds` and `lookupd_http_addresses` are set only the FastlyNsq.consumer_nsqds will be used.
|
66
|
+
#
|
64
67
|
# @param topic [String] NSQ topic from which to consume
|
65
68
|
# @param channel [String] NSQ channel from which to consume
|
66
69
|
# @param queue [#pop, #size] Queue object, most likely an instance of {FastlyNsq::Feeder}
|
@@ -78,11 +81,11 @@ class FastlyNsq::Consumer
|
|
78
81
|
# channel: 'channel'
|
79
82
|
# )
|
80
83
|
def initialize(topic:, channel:, queue: nil, tls_options: nil, connect_timeout: DEFAULT_CONNECTION_TIMEOUT, max_attempts: FastlyNsq.max_attempts, **options)
|
81
|
-
@topic
|
82
|
-
@channel
|
83
|
-
@tls_options
|
84
|
+
@topic = topic
|
85
|
+
@channel = channel
|
86
|
+
@tls_options = FastlyNsq::TlsOptions.as_hash(tls_options)
|
84
87
|
@connect_timeout = connect_timeout
|
85
|
-
@max_attempts
|
88
|
+
@max_attempts = max_attempts
|
86
89
|
|
87
90
|
@connection = connect(queue, **options)
|
88
91
|
end
|
@@ -99,15 +102,25 @@ class FastlyNsq::Consumer
|
|
99
102
|
attr_reader :tls_options
|
100
103
|
|
101
104
|
def connect(queue, **options)
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
)
|
105
|
+
consumers = FastlyNsq.consumer_nsqds
|
106
|
+
lookupd = FastlyNsq.lookupd_http_addresses
|
107
|
+
|
108
|
+
opts = {
|
109
|
+
topic: topic,
|
110
|
+
channel: channel,
|
111
|
+
queue: queue,
|
112
|
+
max_attempts: max_attempts,
|
113
|
+
**options
|
114
|
+
}.merge(tls_options)
|
115
|
+
|
116
|
+
if !consumers.empty?
|
117
|
+
opts[:nsqd] = consumers
|
118
|
+
elsif !lookupd.empty?
|
119
|
+
opts[:nsqlookupd] = lookupd
|
120
|
+
else
|
121
|
+
raise FastlyNsq::ConnectionFailed, "One of FastlyNsq.consumer_nsqds or FastlyNsq.lookupd_http_addresses must be present"
|
122
|
+
end
|
123
|
+
|
124
|
+
Nsq::Consumer.new(opts)
|
112
125
|
end
|
113
126
|
end
|
data/lib/fastly_nsq/feeder.rb
CHANGED
@@ -36,13 +36,11 @@ class FastlyNsq::Feeder
|
|
36
36
|
# @see Nsq::Connection#read_loop
|
37
37
|
def push(message)
|
38
38
|
FastlyNsq.manager.pool.post(priority) do
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
raise ex
|
45
|
-
end
|
39
|
+
processor.call(message)
|
40
|
+
rescue => ex
|
41
|
+
FastlyNsq.logger.error ex
|
42
|
+
FastlyNsq.tracer.notice_error ex
|
43
|
+
raise ex
|
46
44
|
end
|
47
45
|
end
|
48
46
|
end
|