ruby-kafka 0.3.15.beta3 → 0.3.15
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/CHANGELOG.md +1 -4
- data/README.md +43 -5
- data/lib/kafka/consumer.rb +2 -1
- data/lib/kafka/consumer_group.rb +5 -0
- data/lib/kafka/offset_manager.rb +6 -3
- data/lib/kafka/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e781eb534c5c2ee94905fe5665270df1d688689
|
4
|
+
data.tar.gz: a95297b844741019599e14bae2ca7afa34304538
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3d32a672b934ccaa48e49b2af92220d2bc7d435a642e43b1161f0a57e419f495c4a569c738cc85a24c0c719da608284164f9f83e96ba2a46c06e13e436d2700
|
7
|
+
data.tar.gz: 5283ffa3ba2f5968acf24ae73eb5b300ad38dd78907a8524e22d5d45e4ba20ac9caaa9efd6458cf7fddca3b897c1f6ff7344efd7bf55536b178c9c427e669854
|
data/CHANGELOG.md
CHANGED
@@ -4,12 +4,9 @@ Changes and additions to the library will be listed here.
|
|
4
4
|
|
5
5
|
## Unreleased
|
6
6
|
|
7
|
-
## v0.3.15
|
7
|
+
## v0.3.15
|
8
8
|
|
9
9
|
- Allow setting a timeout on a partition pause (#272).
|
10
|
-
|
11
|
-
## v0.3.15.beta1
|
12
|
-
|
13
10
|
- Allow pausing consumption of a partition (#268).
|
14
11
|
|
15
12
|
## v0.3.14
|
data/README.md
CHANGED
@@ -32,11 +32,14 @@ Although parts of this library work with Kafka 0.8 – specifically, the Produce
|
|
32
32
|
4. [Thread Safety](#thread-safety)
|
33
33
|
5. [Logging](#logging)
|
34
34
|
6. [Instrumentation](#instrumentation)
|
35
|
-
7. [
|
36
|
-
|
35
|
+
7. [Monitoring](#monitoring)
|
36
|
+
1. [Reporting Metrics to Datadog](#reporting-metrics-to-datadog)
|
37
|
+
8. [Understanding Timeouts](#understanding-timeouts)
|
38
|
+
9. [Encryption and Authentication using SSL](#encryption-and-authentication-using-ssl)
|
37
39
|
4. [Design](#design)
|
38
40
|
1. [Producer Design](#producer-design)
|
39
41
|
2. [Asynchronous Producer Design](#asynchronous-producer-design)
|
42
|
+
3. [Consumer Design](#consumer-design)
|
40
43
|
5. [Development](#development)
|
41
44
|
6. [Roadmap](#roadmap)
|
42
45
|
|
@@ -140,9 +143,9 @@ kafka.deliver_message("Hello, World!", key: "hello", topic: "greetings")
|
|
140
143
|
|
141
144
|
#### Efficiently Producing Messages
|
142
145
|
|
143
|
-
While `#deliver_message` works fine for infrequent writes, there are a number of
|
146
|
+
While `#deliver_message` works fine for infrequent writes, there are a number of downsides:
|
144
147
|
|
145
|
-
* Kafka is optimized for transmitting
|
148
|
+
* Kafka is optimized for transmitting messages in _batches_ rather than individually, so there's a significant overhead and performance penalty in using the single-message API.
|
146
149
|
* The message delivery can fail in a number of different ways, but this simplistic API does not provide automatic retries.
|
147
150
|
* The message is not buffered, so if there is an error, it is lost.
|
148
151
|
|
@@ -662,6 +665,37 @@ end
|
|
662
665
|
* `request_size` is the number of bytes in the request.
|
663
666
|
* `response_size` is the number of bytes in the response.
|
664
667
|
|
668
|
+
|
669
|
+
### Monitoring
|
670
|
+
|
671
|
+
It is highly recommended that you monitor your Kafka client applications in production. Typical problems you'll see are:
|
672
|
+
|
673
|
+
* high network errors rates, which may impact performance and time-to-delivery;
|
674
|
+
* producer buffer growth, which may indicate that producers are unable to deliver messages at the rate they're being produced;
|
675
|
+
* consumer processing errors, indicating exceptions are being raised in the processing code;
|
676
|
+
* frequent consumer rebalances, which may indicate unstable network conditions or consumer configurations.
|
677
|
+
|
678
|
+
You can quite easily build monitoring on top of the provided [instrumentation hooks](#instrumentation). In order to further help with monitoring, a prebuilt [Datadog](https://www.datadoghq.com/) reporter is included with ruby-kafka.
|
679
|
+
|
680
|
+
|
681
|
+
#### Reporting Metrics to Datadog
|
682
|
+
|
683
|
+
The Datadog reporter is automatically enabled when the `kafka/datadog` library is required. You can optionally change the configuration.
|
684
|
+
|
685
|
+
```ruby
|
686
|
+
# This enables the reporter:
|
687
|
+
require "kafka/datadog"
|
688
|
+
|
689
|
+
# Default is "ruby_kafka".
|
690
|
+
Kafka::Datadog.namespace = "custom-namespace"
|
691
|
+
|
692
|
+
# Default is "127.0.0.1".
|
693
|
+
Kafka::Datadog.host = "statsd.something.com"
|
694
|
+
|
695
|
+
# Default is 8125.
|
696
|
+
Kafka::Datadog.port = 1234
|
697
|
+
```
|
698
|
+
|
665
699
|
### Understanding Timeouts
|
666
700
|
|
667
701
|
It's important to understand how timeouts work if you have a latency sensitive application. This library allows configuring timeouts on different levels:
|
@@ -744,6 +778,10 @@ Instead of writing directly into the pending message list, [`Kafka::AsyncProduce
|
|
744
778
|
|
745
779
|
Rather than triggering message deliveries directly, users of the async producer will typically set up _automatic triggers_, such as a timer.
|
746
780
|
|
781
|
+
### Consumer Design
|
782
|
+
|
783
|
+
The Consumer API is designed for flexibility and stability. The first is accomplished by not dictating any high-level object model, instead opting for a simple loop-based approach. The second is accomplished by handling group membership, heartbeats, and checkpointing automatically. Messages are marked as processed as soon as they've been successfully yielded to the user-supplied processing block, minimizing the cost of processing errors.
|
784
|
+
|
747
785
|
## Development
|
748
786
|
|
749
787
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -764,7 +802,7 @@ Beta release of the Consumer API, allowing balanced Consumer Groups coordinating
|
|
764
802
|
|
765
803
|
API freeze. All new changes will be backwards compatible.
|
766
804
|
|
767
|
-
## Why
|
805
|
+
## Why Create A New Library?
|
768
806
|
|
769
807
|
There are a few existing Kafka clients in Ruby:
|
770
808
|
|
data/lib/kafka/consumer.rb
CHANGED
@@ -143,6 +143,7 @@ module Kafka
|
|
143
143
|
elsif Time.now < timeout
|
144
144
|
true
|
145
145
|
else
|
146
|
+
@logger.info "Automatically resuming partition #{topic}/#{partition}, pause timeout expired"
|
146
147
|
resume(topic, partition)
|
147
148
|
false
|
148
149
|
end
|
@@ -280,7 +281,7 @@ module Kafka
|
|
280
281
|
yield
|
281
282
|
rescue HeartbeatError, OffsetCommitError
|
282
283
|
join_group
|
283
|
-
rescue FetchError
|
284
|
+
rescue FetchError, NotLeaderForPartition, UnknownTopicOrPartition
|
284
285
|
@cluster.mark_as_stale!
|
285
286
|
rescue LeaderNotAvailable => e
|
286
287
|
@logger.error "Leader not available; waiting 1s before retrying"
|
data/lib/kafka/consumer_group.rb
CHANGED
@@ -89,6 +89,11 @@ module Kafka
|
|
89
89
|
rescue ConnectionError, UnknownMemberId, RebalanceInProgress, IllegalGeneration => e
|
90
90
|
@logger.error "Error sending heartbeat: #{e}"
|
91
91
|
raise HeartbeatError, e
|
92
|
+
rescue NotCoordinatorForGroup
|
93
|
+
@logger.error "Failed to find coordinator for group `#{@group_id}`; retrying..."
|
94
|
+
sleep 1
|
95
|
+
@coordinator = nil
|
96
|
+
retry
|
92
97
|
end
|
93
98
|
|
94
99
|
private
|
data/lib/kafka/offset_manager.rb
CHANGED
@@ -22,7 +22,10 @@ module Kafka
|
|
22
22
|
def mark_as_processed(topic, partition, offset)
|
23
23
|
@uncommitted_offsets += 1
|
24
24
|
@processed_offsets[topic] ||= {}
|
25
|
-
|
25
|
+
|
26
|
+
# The committed offset should always be the offset of the next message that the
|
27
|
+
# application will read, thus adding one to the last message processed
|
28
|
+
@processed_offsets[topic][partition] = offset + 1
|
26
29
|
@logger.debug "Marking #{topic}/#{partition}:#{offset} as committed"
|
27
30
|
end
|
28
31
|
|
@@ -41,8 +44,8 @@ module Kafka
|
|
41
44
|
if offset < 0
|
42
45
|
resolve_offset(topic, partition)
|
43
46
|
else
|
44
|
-
# The next offset is the last offset
|
45
|
-
offset
|
47
|
+
# The next offset is the last offset.
|
48
|
+
offset
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
data/lib/kafka/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-kafka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.15
|
4
|
+
version: 0.3.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -317,9 +317,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
317
317
|
version: 2.1.0
|
318
318
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
319
319
|
requirements:
|
320
|
-
- - "
|
320
|
+
- - ">="
|
321
321
|
- !ruby/object:Gem::Version
|
322
|
-
version:
|
322
|
+
version: '0'
|
323
323
|
requirements: []
|
324
324
|
rubyforge_project:
|
325
325
|
rubygems_version: 2.4.5.1
|