racecar 2.4.0 → 2.8.2
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/.github/dependabot.yml +17 -0
- data/.github/workflows/ci.yml +1 -1
- data/CHANGELOG.md +24 -0
- data/Gemfile.lock +11 -11
- data/README.md +4 -0
- data/lib/racecar/config.rb +1 -0
- data/lib/racecar/consumer.rb +4 -2
- data/lib/racecar/consumer_set.rb +6 -0
- data/lib/racecar/datadog.rb +5 -1
- data/lib/racecar/erroneous_state_error.rb +34 -0
- data/lib/racecar/runner.rb +2 -0
- data/lib/racecar/version.rb +1 -1
- data/racecar.gemspec +3 -3
- metadata +10 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4cbf6ca4837bdd3893c8342936f9d5ea115a5b3a585e0c843e62171e00038e72
|
|
4
|
+
data.tar.gz: d8603c46cf801d0f41f017d5b27b35e0d2b195eec5be11a1f7b6bf77413726b4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 78bdedfe7bd888a3716f5a29f28810f4c4d2f03e43c33b8e47ed08607155211fca1d47f4eab6a4f0def6976bb7ca3263117e52d2e0fa7f0a721c56ec70c7ee3d
|
|
7
|
+
data.tar.gz: 2bf6e2b50980add68363b59718f54403caada58abcb404a9018ac4304519bbbb7ed920578d37bcadefad63964812e7374d367298f403577725eef79af269c604
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
registries:
|
|
3
|
+
artifactory:
|
|
4
|
+
type: rubygems-server
|
|
5
|
+
url: ${{secrets.ARTIFACTORY_URL}}
|
|
6
|
+
username: ${{secrets.ARTIFACTORY_USERNAME}}
|
|
7
|
+
password: ${{secrets.ARTIFACTORY_API_KEY}}
|
|
8
|
+
updates:
|
|
9
|
+
- package-ecosystem: "bundler"
|
|
10
|
+
vendor: true
|
|
11
|
+
directory: "/"
|
|
12
|
+
registries:
|
|
13
|
+
- artifactory
|
|
14
|
+
schedule:
|
|
15
|
+
interval: "daily"
|
|
16
|
+
allow:
|
|
17
|
+
- dependency-type: "direct" # only explicitly defined dependencies.
|
data/.github/workflows/ci.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## v2.8.2
|
|
6
|
+
* Handles ErroneousStateError, in previous versions the consumer would do several unecessary group leave/joins. The log level is also changed to WARN instead of ERROR. ([#285](https://github.com/zendesk/racecar/pull/295))
|
|
7
|
+
|
|
8
|
+
## v2.8.1
|
|
9
|
+
* Adds new ErroneousStateError to racecar in order to give more information on this new possible exception.
|
|
10
|
+
|
|
11
|
+
## v2.8.0
|
|
12
|
+
* Update librdkafka version from 1.8.2 to 1.9.0 by upgrading from rdkafka 0.10.0 to 0.12.0. ([#283](https://github.com/zendesk/racecar/pull/293))
|
|
13
|
+
|
|
14
|
+
## v2.7.0
|
|
15
|
+
|
|
16
|
+
* Update librdkafka version from 1.5.0 to 1.8.2 by upgrading from rdkafka 0.10.0 to 0.11.1. ([#283](https://github.com/zendesk/racecar/pull/283))
|
|
17
|
+
* Bumps minimum required Ruby version to 2.6
|
|
18
|
+
|
|
19
|
+
## v2.6.0
|
|
20
|
+
|
|
21
|
+
* Add capability to specify partition number when producing messages
|
|
22
|
+
|
|
23
|
+
## v2.5.0
|
|
24
|
+
|
|
25
|
+
* `fetch_messages` can be configured per consumer, just as the maximum timeout to wait for a full batch.
|
|
26
|
+
|
|
3
27
|
## v2.4.0
|
|
4
28
|
|
|
5
29
|
* Update librdkafka version from 1.4.0 to 1.5.0 by upgrading from rdkafka 0.8.0 to 0.10.0. ([#263](https://github.com/zendesk/racecar/pull/263))
|
data/Gemfile.lock
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
racecar (2.
|
|
4
|
+
racecar (2.8.2.beta)
|
|
5
5
|
king_konf (~> 1.0.0)
|
|
6
|
-
rdkafka (~> 0.
|
|
6
|
+
rdkafka (~> 0.12.0)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: https://rubygems.org/
|
|
@@ -16,22 +16,22 @@ GEM
|
|
|
16
16
|
coderay (1.1.3)
|
|
17
17
|
concurrent-ruby (1.1.9)
|
|
18
18
|
diff-lcs (1.4.4)
|
|
19
|
-
dogstatsd-ruby (
|
|
20
|
-
ffi (1.15.
|
|
19
|
+
dogstatsd-ruby (5.2.0)
|
|
20
|
+
ffi (1.15.5)
|
|
21
21
|
i18n (1.8.10)
|
|
22
22
|
concurrent-ruby (~> 1.0)
|
|
23
23
|
king_konf (1.0.0)
|
|
24
24
|
method_source (1.0.0)
|
|
25
|
-
mini_portile2 (2.
|
|
25
|
+
mini_portile2 (2.8.0)
|
|
26
26
|
minitest (5.14.4)
|
|
27
27
|
pry (0.13.1)
|
|
28
28
|
coderay (~> 1.1)
|
|
29
29
|
method_source (~> 1.0)
|
|
30
30
|
rake (13.0.1)
|
|
31
|
-
rdkafka (0.
|
|
32
|
-
ffi (~> 1.
|
|
33
|
-
mini_portile2 (~> 2.
|
|
34
|
-
rake (
|
|
31
|
+
rdkafka (0.12.0)
|
|
32
|
+
ffi (~> 1.15)
|
|
33
|
+
mini_portile2 (~> 2.6)
|
|
34
|
+
rake (> 12)
|
|
35
35
|
rspec (3.10.0)
|
|
36
36
|
rspec-core (~> 3.10.0)
|
|
37
37
|
rspec-expectations (~> 3.10.0)
|
|
@@ -56,7 +56,7 @@ PLATFORMS
|
|
|
56
56
|
DEPENDENCIES
|
|
57
57
|
activesupport (< 6.0)
|
|
58
58
|
bundler (>= 1.13, < 3)
|
|
59
|
-
dogstatsd-ruby (>= 4.0.0, <
|
|
59
|
+
dogstatsd-ruby (>= 4.0.0, < 6.0.0)
|
|
60
60
|
pry
|
|
61
61
|
racecar!
|
|
62
62
|
rake (> 10.0)
|
|
@@ -64,4 +64,4 @@ DEPENDENCIES
|
|
|
64
64
|
timecop
|
|
65
65
|
|
|
66
66
|
BUNDLED WITH
|
|
67
|
-
2.
|
|
67
|
+
2.3.7
|
data/README.md
CHANGED
|
@@ -269,6 +269,10 @@ end
|
|
|
269
269
|
- `group_id` – The group id to use for a given group of consumers. Note that this _must_ be different for each consumer class. If left blank a group id is generated based on the consumer class name such that (for example) a consumer with the class name `BaconConsumer` would default to a group id of `bacon-consumer`.
|
|
270
270
|
- `group_id_prefix` – A prefix used when generating consumer group names. For instance, if you set the prefix to be `kevin.` and your consumer class is named `BaconConsumer`, the resulting consumer group will be named `kevin.bacon-consumer`.
|
|
271
271
|
|
|
272
|
+
#### Batches
|
|
273
|
+
|
|
274
|
+
- `fetch_messages` - The number of messages to fetch in a single batch. This can be set on a per consumer basis.
|
|
275
|
+
|
|
272
276
|
#### Logging
|
|
273
277
|
|
|
274
278
|
- `logfile` – A filename that log messages should be written to. Default is `nil`, which means logs will be written to standard output.
|
data/lib/racecar/config.rb
CHANGED
|
@@ -223,6 +223,7 @@ module Racecar
|
|
|
223
223
|
self.parallel_workers = consumer_class.parallel_workers
|
|
224
224
|
self.subscriptions = consumer_class.subscriptions
|
|
225
225
|
self.max_wait_time = consumer_class.max_wait_time || self.max_wait_time
|
|
226
|
+
self.fetch_messages = consumer_class.fetch_messages || self.fetch_messages
|
|
226
227
|
self.pidfile ||= "#{group_id}.pid"
|
|
227
228
|
end
|
|
228
229
|
|
data/lib/racecar/consumer.rb
CHANGED
|
@@ -9,7 +9,7 @@ module Racecar
|
|
|
9
9
|
class << self
|
|
10
10
|
attr_accessor :max_wait_time
|
|
11
11
|
attr_accessor :group_id
|
|
12
|
-
attr_accessor :producer, :consumer, :parallel_workers
|
|
12
|
+
attr_accessor :producer, :consumer, :parallel_workers, :fetch_messages
|
|
13
13
|
|
|
14
14
|
def subscriptions
|
|
15
15
|
@subscriptions ||= []
|
|
@@ -93,13 +93,14 @@ module Racecar
|
|
|
93
93
|
protected
|
|
94
94
|
|
|
95
95
|
# https://github.com/appsignal/rdkafka-ruby#producing-messages
|
|
96
|
-
def produce(payload, topic:, key: nil, partition_key: nil, headers: nil, create_time: nil)
|
|
96
|
+
def produce(payload, topic:, key: nil, partition: nil, partition_key: nil, headers: nil, create_time: nil)
|
|
97
97
|
@delivery_handles ||= []
|
|
98
98
|
message_size = payload.respond_to?(:bytesize) ? payload.bytesize : 0
|
|
99
99
|
instrumentation_payload = {
|
|
100
100
|
value: payload,
|
|
101
101
|
headers: headers,
|
|
102
102
|
key: key,
|
|
103
|
+
partition: partition,
|
|
103
104
|
partition_key: partition_key,
|
|
104
105
|
topic: topic,
|
|
105
106
|
message_size: message_size,
|
|
@@ -112,6 +113,7 @@ module Racecar
|
|
|
112
113
|
topic: topic,
|
|
113
114
|
payload: payload,
|
|
114
115
|
key: key,
|
|
116
|
+
partition: partition,
|
|
115
117
|
partition_key: partition_key,
|
|
116
118
|
timestamp: create_time,
|
|
117
119
|
headers: headers,
|
data/lib/racecar/consumer_set.rb
CHANGED
|
@@ -49,6 +49,12 @@ module Racecar
|
|
|
49
49
|
|
|
50
50
|
def store_offset(message)
|
|
51
51
|
current.store_offset(message)
|
|
52
|
+
rescue Rdkafka::RdkafkaError => e
|
|
53
|
+
if e.code == :state # -172
|
|
54
|
+
@logger.warn "Attempted to store_offset, but we're not subscribed to it: #{ErroneousStateError.new(e)}"
|
|
55
|
+
return
|
|
56
|
+
end
|
|
57
|
+
raise e
|
|
52
58
|
end
|
|
53
59
|
|
|
54
60
|
def commit
|
data/lib/racecar/datadog.rb
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# `rd_kafka_offsets_store()` (et.al) returns an error for any
|
|
2
|
+
# partition that is not currently assigned (through `rd_kafka_*assign()`).
|
|
3
|
+
# This prevents a race condition where an application would store offsets
|
|
4
|
+
# after the assigned partitions had been revoked (which resets the stored
|
|
5
|
+
# offset), that could cause these old stored offsets to be committed later
|
|
6
|
+
# when the same partitions were assigned to this consumer again - effectively
|
|
7
|
+
# overwriting any committed offsets by any consumers that were assigned the
|
|
8
|
+
# same partitions previously. This would typically result in the offsets
|
|
9
|
+
# rewinding and messages to be reprocessed.
|
|
10
|
+
# As an extra effort to avoid this situation the stored offset is now
|
|
11
|
+
# also reset when partitions are assigned (through `rd_kafka_*assign()`).
|
|
12
|
+
module Racecar
|
|
13
|
+
class ErroneousStateError < StandardError
|
|
14
|
+
def initialize(rdkafka_error)
|
|
15
|
+
raise rdkafka_error unless rdkafka_error.is_a?(Rdkafka::RdkafkaError)
|
|
16
|
+
|
|
17
|
+
@rdkafka_error = rdkafka_error
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
attr_reader :rdkafka_error
|
|
21
|
+
|
|
22
|
+
def code
|
|
23
|
+
@rdkafka_error.code
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_s
|
|
27
|
+
<<~EOM
|
|
28
|
+
Partition is no longer assigned to this consumer and the offset could not be stored for commit.
|
|
29
|
+
#{@rdkafka_error.to_s}
|
|
30
|
+
EOM
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
data/lib/racecar/runner.rb
CHANGED
|
@@ -4,6 +4,7 @@ require "rdkafka"
|
|
|
4
4
|
require "racecar/pause"
|
|
5
5
|
require "racecar/message"
|
|
6
6
|
require "racecar/message_delivery_error"
|
|
7
|
+
require "racecar/erroneous_state_error"
|
|
7
8
|
|
|
8
9
|
module Racecar
|
|
9
10
|
class Runner
|
|
@@ -92,6 +93,7 @@ module Racecar
|
|
|
92
93
|
end
|
|
93
94
|
ensure
|
|
94
95
|
producer.close
|
|
96
|
+
Racecar::Datadog.close if Object.const_defined?("Racecar::Datadog")
|
|
95
97
|
end
|
|
96
98
|
|
|
97
99
|
def stop
|
data/lib/racecar/version.rb
CHANGED
data/racecar.gemspec
CHANGED
|
@@ -20,16 +20,16 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
21
21
|
spec.require_paths = ["lib"]
|
|
22
22
|
|
|
23
|
-
spec.required_ruby_version = '>= 2.
|
|
23
|
+
spec.required_ruby_version = '>= 2.6'
|
|
24
24
|
|
|
25
25
|
spec.add_runtime_dependency "king_konf", "~> 1.0.0"
|
|
26
|
-
spec.add_runtime_dependency "rdkafka", "~> 0.
|
|
26
|
+
spec.add_runtime_dependency "rdkafka", "~> 0.12.0"
|
|
27
27
|
|
|
28
28
|
spec.add_development_dependency "bundler", [">= 1.13", "< 3"]
|
|
29
29
|
spec.add_development_dependency "pry"
|
|
30
30
|
spec.add_development_dependency "rake", "> 10.0"
|
|
31
31
|
spec.add_development_dependency "rspec", "~> 3.0"
|
|
32
32
|
spec.add_development_dependency "timecop"
|
|
33
|
-
spec.add_development_dependency "dogstatsd-ruby", ">= 4.0.0", "<
|
|
33
|
+
spec.add_development_dependency "dogstatsd-ruby", ">= 4.0.0", "< 6.0.0"
|
|
34
34
|
spec.add_development_dependency "activesupport", ">= 4.0", "< 6.1"
|
|
35
35
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: racecar
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.8.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Schierbeck
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2022-07-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: king_konf
|
|
@@ -31,14 +31,14 @@ dependencies:
|
|
|
31
31
|
requirements:
|
|
32
32
|
- - "~>"
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: 0.
|
|
34
|
+
version: 0.12.0
|
|
35
35
|
type: :runtime
|
|
36
36
|
prerelease: false
|
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
38
|
requirements:
|
|
39
39
|
- - "~>"
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
|
-
version: 0.
|
|
41
|
+
version: 0.12.0
|
|
42
42
|
- !ruby/object:Gem::Dependency
|
|
43
43
|
name: bundler
|
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -124,7 +124,7 @@ dependencies:
|
|
|
124
124
|
version: 4.0.0
|
|
125
125
|
- - "<"
|
|
126
126
|
- !ruby/object:Gem::Version
|
|
127
|
-
version:
|
|
127
|
+
version: 6.0.0
|
|
128
128
|
type: :development
|
|
129
129
|
prerelease: false
|
|
130
130
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -134,7 +134,7 @@ dependencies:
|
|
|
134
134
|
version: 4.0.0
|
|
135
135
|
- - "<"
|
|
136
136
|
- !ruby/object:Gem::Version
|
|
137
|
-
version:
|
|
137
|
+
version: 6.0.0
|
|
138
138
|
- !ruby/object:Gem::Dependency
|
|
139
139
|
name: activesupport
|
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -166,6 +166,7 @@ extensions: []
|
|
|
166
166
|
extra_rdoc_files: []
|
|
167
167
|
files:
|
|
168
168
|
- ".circleci/config.yml"
|
|
169
|
+
- ".github/dependabot.yml"
|
|
169
170
|
- ".github/workflows/ci.yml"
|
|
170
171
|
- ".gitignore"
|
|
171
172
|
- ".rspec"
|
|
@@ -199,6 +200,7 @@ files:
|
|
|
199
200
|
- lib/racecar/ctl.rb
|
|
200
201
|
- lib/racecar/daemon.rb
|
|
201
202
|
- lib/racecar/datadog.rb
|
|
203
|
+
- lib/racecar/erroneous_state_error.rb
|
|
202
204
|
- lib/racecar/heroku.rb
|
|
203
205
|
- lib/racecar/instrumenter.rb
|
|
204
206
|
- lib/racecar/message.rb
|
|
@@ -222,14 +224,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
222
224
|
requirements:
|
|
223
225
|
- - ">="
|
|
224
226
|
- !ruby/object:Gem::Version
|
|
225
|
-
version: '2.
|
|
227
|
+
version: '2.6'
|
|
226
228
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
229
|
requirements:
|
|
228
230
|
- - ">="
|
|
229
231
|
- !ruby/object:Gem::Version
|
|
230
232
|
version: '0'
|
|
231
233
|
requirements: []
|
|
232
|
-
rubygems_version: 3.
|
|
234
|
+
rubygems_version: 3.0.3
|
|
233
235
|
signing_key:
|
|
234
236
|
specification_version: 4
|
|
235
237
|
summary: A framework for running Kafka consumers
|