ruby-kafka 0.7.6 → 0.7.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +1 -0
- data/lib/kafka/broker.rb +12 -0
- data/lib/kafka/client.rb +2 -2
- data/lib/kafka/compression.rb +13 -11
- data/lib/kafka/compressor.rb +1 -0
- data/lib/kafka/fetched_batch.rb +5 -1
- data/lib/kafka/fetched_batch_generator.rb +3 -0
- data/lib/kafka/fetched_message.rb +1 -0
- data/lib/kafka/gzip_codec.rb +4 -0
- data/lib/kafka/lz4_codec.rb +4 -0
- data/lib/kafka/producer.rb +16 -0
- data/lib/kafka/protocol.rb +8 -0
- data/lib/kafka/protocol/add_offsets_to_txn_request.rb +29 -0
- data/lib/kafka/protocol/add_offsets_to_txn_response.rb +19 -0
- data/lib/kafka/protocol/produce_request.rb +3 -1
- data/lib/kafka/protocol/txn_offset_commit_request.rb +46 -0
- data/lib/kafka/protocol/txn_offset_commit_response.rb +18 -0
- data/lib/kafka/snappy_codec.rb +4 -0
- data/lib/kafka/ssl_context.rb +2 -0
- data/lib/kafka/ssl_socket_with_timeout.rb +1 -0
- data/lib/kafka/transaction_manager.rb +25 -0
- data/lib/kafka/version.rb +1 -1
- data/lib/kafka/zstd_codec.rb +27 -0
- data/ruby-kafka.gemspec +1 -0
- metadata +21 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe93873554ad9e17df699fa49612e0dae938a498c086ae765bf83b79f4a8106f
|
4
|
+
data.tar.gz: eb56576533a3b5d1983e755fc0399464315a47f43d6fc68d9ef20c4df5f6d351
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19158030f7e028cb5dc350a405867273dadfaaa81208f4684c8c6a68b4d4b2507f97ec13b171e58da1b0277fa6712ccb3db50735cd0db5dd3d9839c0ddcba18b
|
7
|
+
data.tar.gz: d37f2e3ceb765ce5bf267ddcdbcf524251de9356b4e0fa1d16562cf762b99047146c2cda80482792b3f4845b789a8cf8446613f9e49990a22cf73844b9380714
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,11 @@ Changes and additions to the library will be listed here.
|
|
4
4
|
|
5
5
|
## Unreleased
|
6
6
|
|
7
|
+
## 0.7.7
|
8
|
+
- Producer send offsets in transaction (#723)
|
9
|
+
- Support zstd compression (#724)
|
10
|
+
- Verify SSL Certificates (#730)
|
11
|
+
|
7
12
|
## 0.7.6
|
8
13
|
- Introduce regex matching in `Consumer#subscribe` (#700)
|
9
14
|
- Only rejoin group on error if we're not in shutdown mode (#711)
|
data/README.md
CHANGED
@@ -424,6 +424,7 @@ Compression is enabled by passing the `compression_codec` parameter to `#produce
|
|
424
424
|
* `:snappy` for [Snappy](http://google.github.io/snappy/) compression.
|
425
425
|
* `:gzip` for [gzip](https://en.wikipedia.org/wiki/Gzip) compression.
|
426
426
|
* `:lz4` for [LZ4](https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)) compression.
|
427
|
+
* `:zstd` for [zstd](https://facebook.github.io/zstd/) compression.
|
427
428
|
|
428
429
|
By default, all message sets will be compressed if you specify a compression codec. To increase the compression threshold, set `compression_threshold` to an integer value higher than one.
|
429
430
|
|
data/lib/kafka/broker.rb
CHANGED
@@ -182,6 +182,18 @@ module Kafka
|
|
182
182
|
send_request(request)
|
183
183
|
end
|
184
184
|
|
185
|
+
def add_offsets_to_txn(**options)
|
186
|
+
request = Protocol::AddOffsetsToTxnRequest.new(**options)
|
187
|
+
|
188
|
+
send_request(request)
|
189
|
+
end
|
190
|
+
|
191
|
+
def txn_offset_commit(**options)
|
192
|
+
request = Protocol::TxnOffsetCommitRequest.new(**options)
|
193
|
+
|
194
|
+
send_request(request)
|
195
|
+
end
|
196
|
+
|
185
197
|
private
|
186
198
|
|
187
199
|
def send_request(request)
|
data/lib/kafka/client.rb
CHANGED
@@ -233,8 +233,8 @@ module Kafka
|
|
233
233
|
# result in {BufferOverflow} being raised.
|
234
234
|
#
|
235
235
|
# @param compression_codec [Symbol, nil] the name of the compression codec to
|
236
|
-
# use, or nil if no compression should be performed. Valid codecs: `:snappy
|
237
|
-
#
|
236
|
+
# use, or nil if no compression should be performed. Valid codecs: `:snappy`,
|
237
|
+
# `:gzip`, `:lz4`, `:zstd`
|
238
238
|
#
|
239
239
|
# @param compression_threshold [Integer] the number of messages that needs to
|
240
240
|
# be in a message set before it should be compressed. Note that message sets
|
data/lib/kafka/compression.rb
CHANGED
@@ -3,27 +3,27 @@
|
|
3
3
|
require "kafka/snappy_codec"
|
4
4
|
require "kafka/gzip_codec"
|
5
5
|
require "kafka/lz4_codec"
|
6
|
+
require "kafka/zstd_codec"
|
6
7
|
|
7
8
|
module Kafka
|
8
9
|
module Compression
|
9
|
-
|
10
|
-
1 => :gzip,
|
11
|
-
2 => :snappy,
|
12
|
-
3 => :lz4,
|
13
|
-
}.freeze
|
14
|
-
|
15
|
-
CODECS = {
|
10
|
+
CODECS_BY_NAME = {
|
16
11
|
:gzip => GzipCodec.new,
|
17
12
|
:snappy => SnappyCodec.new,
|
18
13
|
:lz4 => LZ4Codec.new,
|
14
|
+
:zstd => ZstdCodec.new,
|
19
15
|
}.freeze
|
20
16
|
|
17
|
+
CODECS_BY_ID = CODECS_BY_NAME.each_with_object({}) do |(_, codec), hash|
|
18
|
+
hash[codec.codec_id] = codec
|
19
|
+
end.freeze
|
20
|
+
|
21
21
|
def self.codecs
|
22
|
-
|
22
|
+
CODECS_BY_NAME.keys
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.find_codec(name)
|
26
|
-
codec =
|
26
|
+
codec = CODECS_BY_NAME.fetch(name) do
|
27
27
|
raise "Unknown compression codec #{name}"
|
28
28
|
end
|
29
29
|
|
@@ -33,11 +33,13 @@ module Kafka
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.find_codec_by_id(codec_id)
|
36
|
-
|
36
|
+
codec = CODECS_BY_ID.fetch(codec_id) do
|
37
37
|
raise "Unknown codec id #{codec_id}"
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
codec.load
|
41
|
+
|
42
|
+
codec
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
data/lib/kafka/compressor.rb
CHANGED
data/lib/kafka/fetched_batch.rb
CHANGED
@@ -13,18 +13,22 @@ module Kafka
|
|
13
13
|
# @return [Integer]
|
14
14
|
attr_reader :last_offset
|
15
15
|
|
16
|
+
# @return [Integer]
|
17
|
+
attr_reader :leader_epoch
|
18
|
+
|
16
19
|
# @return [Integer] the offset of the most recent message in the partition.
|
17
20
|
attr_reader :highwater_mark_offset
|
18
21
|
|
19
22
|
# @return [Array<Kafka::FetchedMessage>]
|
20
23
|
attr_accessor :messages
|
21
24
|
|
22
|
-
def initialize(topic:, partition:, highwater_mark_offset:, messages:, last_offset: nil)
|
25
|
+
def initialize(topic:, partition:, highwater_mark_offset:, messages:, last_offset: nil, leader_epoch: nil)
|
23
26
|
@topic = topic
|
24
27
|
@partition = partition
|
25
28
|
@highwater_mark_offset = highwater_mark_offset
|
26
29
|
@messages = messages
|
27
30
|
@last_offset = last_offset
|
31
|
+
@leader_epoch = leader_epoch
|
28
32
|
end
|
29
33
|
|
30
34
|
def empty?
|
@@ -62,11 +62,13 @@ module Kafka
|
|
62
62
|
def extract_records
|
63
63
|
records = []
|
64
64
|
last_offset = nil
|
65
|
+
leader_epoch = nil
|
65
66
|
aborted_transactions = @fetched_partition.aborted_transactions.sort_by(&:first_offset)
|
66
67
|
aborted_producer_ids = {}
|
67
68
|
|
68
69
|
@fetched_partition.messages.each do |record_batch|
|
69
70
|
last_offset = record_batch.last_offset if last_offset.nil? || last_offset < record_batch.last_offset
|
71
|
+
leader_epoch = record_batch.partition_leader_epoch if leader_epoch.nil? || leader_epoch < record_batch.partition_leader_epoch
|
70
72
|
# Find the list of aborted producer IDs less than current offset
|
71
73
|
unless aborted_transactions.empty?
|
72
74
|
if aborted_transactions.first.first_offset <= record_batch.last_offset
|
@@ -99,6 +101,7 @@ module Kafka
|
|
99
101
|
topic: @topic,
|
100
102
|
partition: @fetched_partition.partition,
|
101
103
|
last_offset: last_offset,
|
104
|
+
leader_epoch: leader_epoch,
|
102
105
|
highwater_mark_offset: @fetched_partition.highwater_mark_offset,
|
103
106
|
messages: records
|
104
107
|
)
|
data/lib/kafka/gzip_codec.rb
CHANGED
data/lib/kafka/lz4_codec.rb
CHANGED
data/lib/kafka/producer.rb
CHANGED
@@ -68,6 +68,8 @@ module Kafka
|
|
68
68
|
#
|
69
69
|
# * `:snappy` for [Snappy](http://google.github.io/snappy/) compression.
|
70
70
|
# * `:gzip` for [gzip](https://en.wikipedia.org/wiki/Gzip) compression.
|
71
|
+
# * `:lz4` for [LZ4](https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)) compression.
|
72
|
+
# * `:zstd` for [zstd](https://facebook.github.io/zstd/) compression.
|
71
73
|
#
|
72
74
|
# By default, all message sets will be compressed if you specify a compression
|
73
75
|
# codec. To increase the compression threshold, set `compression_threshold` to
|
@@ -328,6 +330,20 @@ module Kafka
|
|
328
330
|
@transaction_manager.abort_transaction
|
329
331
|
end
|
330
332
|
|
333
|
+
# Sends batch last offset to the consumer group coordinator, and also marks
|
334
|
+
# this offset as part of the current transaction. This offset will be considered
|
335
|
+
# committed only if the transaction is committed successfully.
|
336
|
+
#
|
337
|
+
# This method should be used when you need to batch consumed and produced messages
|
338
|
+
# together, typically in a consume-transform-produce pattern. Thus, the specified
|
339
|
+
# group_id should be the same as config parameter group_id of the used
|
340
|
+
# consumer.
|
341
|
+
#
|
342
|
+
# @return [nil]
|
343
|
+
def send_offsets_to_transaction(batch:, group_id:)
|
344
|
+
@transaction_manager.send_offsets_to_txn(offsets: { batch.topic => { batch.partition => { offset: batch.last_offset + 1, leader_epoch: batch.leader_epoch } } }, group_id: group_id)
|
345
|
+
end
|
346
|
+
|
331
347
|
# Syntactic sugar to enable easier transaction usage. Do the following steps
|
332
348
|
#
|
333
349
|
# - Start the transaction (with Producer#begin_transaction)
|
data/lib/kafka/protocol.rb
CHANGED
@@ -33,7 +33,9 @@ module Kafka
|
|
33
33
|
DELETE_TOPICS_API = 20
|
34
34
|
INIT_PRODUCER_ID_API = 22
|
35
35
|
ADD_PARTITIONS_TO_TXN_API = 24
|
36
|
+
ADD_OFFSETS_TO_TXN_API = 25
|
36
37
|
END_TXN_API = 26
|
38
|
+
TXN_OFFSET_COMMIT_API = 28
|
37
39
|
DESCRIBE_CONFIGS_API = 32
|
38
40
|
ALTER_CONFIGS_API = 33
|
39
41
|
CREATE_PARTITIONS_API = 37
|
@@ -57,7 +59,9 @@ module Kafka
|
|
57
59
|
DELETE_TOPICS_API => :delete_topics,
|
58
60
|
INIT_PRODUCER_ID_API => :init_producer_id_api,
|
59
61
|
ADD_PARTITIONS_TO_TXN_API => :add_partitions_to_txn_api,
|
62
|
+
ADD_OFFSETS_TO_TXN_API => :add_offsets_to_txn_api,
|
60
63
|
END_TXN_API => :end_txn_api,
|
64
|
+
TXN_OFFSET_COMMIT_API => :txn_offset_commit_api,
|
61
65
|
DESCRIBE_CONFIGS_API => :describe_configs_api,
|
62
66
|
CREATE_PARTITIONS_API => :create_partitions
|
63
67
|
}
|
@@ -177,6 +181,10 @@ require "kafka/protocol/fetch_request"
|
|
177
181
|
require "kafka/protocol/fetch_response"
|
178
182
|
require "kafka/protocol/list_offset_request"
|
179
183
|
require "kafka/protocol/list_offset_response"
|
184
|
+
require "kafka/protocol/add_offsets_to_txn_request"
|
185
|
+
require "kafka/protocol/add_offsets_to_txn_response"
|
186
|
+
require "kafka/protocol/txn_offset_commit_request"
|
187
|
+
require "kafka/protocol/txn_offset_commit_response"
|
180
188
|
require "kafka/protocol/find_coordinator_request"
|
181
189
|
require "kafka/protocol/find_coordinator_response"
|
182
190
|
require "kafka/protocol/join_group_request"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kafka
|
4
|
+
module Protocol
|
5
|
+
class AddOffsetsToTxnRequest
|
6
|
+
def initialize(transactional_id: nil, producer_id:, producer_epoch:, group_id:)
|
7
|
+
@transactional_id = transactional_id
|
8
|
+
@producer_id = producer_id
|
9
|
+
@producer_epoch = producer_epoch
|
10
|
+
@group_id = group_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def api_key
|
14
|
+
ADD_OFFSETS_TO_TXN_API
|
15
|
+
end
|
16
|
+
|
17
|
+
def response_class
|
18
|
+
AddOffsetsToTxnResponse
|
19
|
+
end
|
20
|
+
|
21
|
+
def encode(encoder)
|
22
|
+
encoder.write_string(@transactional_id.to_s)
|
23
|
+
encoder.write_int64(@producer_id)
|
24
|
+
encoder.write_int16(@producer_epoch)
|
25
|
+
encoder.write_string(@group_id)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Kafka
|
2
|
+
module Protocol
|
3
|
+
class AddOffsetsToTxnResponse
|
4
|
+
|
5
|
+
attr_reader :error_code
|
6
|
+
|
7
|
+
def initialize(error_code:)
|
8
|
+
@error_code = error_code
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.decode(decoder)
|
12
|
+
_throttle_time_ms = decoder.int32
|
13
|
+
error_code = decoder.int16
|
14
|
+
new(error_code: error_code)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -27,6 +27,8 @@ module Kafka
|
|
27
27
|
# Value => bytes
|
28
28
|
#
|
29
29
|
class ProduceRequest
|
30
|
+
API_MIN_VERSION = 3
|
31
|
+
|
30
32
|
attr_reader :transactional_id, :required_acks, :timeout, :messages_for_topics, :compressor
|
31
33
|
|
32
34
|
# @param required_acks [Integer]
|
@@ -45,7 +47,7 @@ module Kafka
|
|
45
47
|
end
|
46
48
|
|
47
49
|
def api_version
|
48
|
-
|
50
|
+
compressor.codec.nil? ? API_MIN_VERSION : [compressor.codec.produce_api_min_version, API_MIN_VERSION].max
|
49
51
|
end
|
50
52
|
|
51
53
|
def response_class
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kafka
|
4
|
+
module Protocol
|
5
|
+
class TxnOffsetCommitRequest
|
6
|
+
|
7
|
+
def api_key
|
8
|
+
TXN_OFFSET_COMMIT_API
|
9
|
+
end
|
10
|
+
|
11
|
+
def api_version
|
12
|
+
2
|
13
|
+
end
|
14
|
+
|
15
|
+
def response_class
|
16
|
+
TxnOffsetCommitResponse
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(transactional_id:, group_id:, producer_id:, producer_epoch:, offsets:)
|
20
|
+
@transactional_id = transactional_id
|
21
|
+
@producer_id = producer_id
|
22
|
+
@producer_epoch = producer_epoch
|
23
|
+
@group_id = group_id
|
24
|
+
@offsets = offsets
|
25
|
+
end
|
26
|
+
|
27
|
+
def encode(encoder)
|
28
|
+
encoder.write_string(@transactional_id.to_s)
|
29
|
+
encoder.write_string(@group_id)
|
30
|
+
encoder.write_int64(@producer_id)
|
31
|
+
encoder.write_int16(@producer_epoch)
|
32
|
+
|
33
|
+
encoder.write_array(@offsets) do |topic, partitions|
|
34
|
+
encoder.write_string(topic)
|
35
|
+
encoder.write_array(partitions) do |partition, offset|
|
36
|
+
encoder.write_int32(partition)
|
37
|
+
encoder.write_int64(offset[:offset])
|
38
|
+
encoder.write_string(nil) # metadata
|
39
|
+
encoder.write_int32(offset[:leader_epoch])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Kafka
|
2
|
+
module Protocol
|
3
|
+
class TxnOffsetCommitResponse
|
4
|
+
|
5
|
+
attr_reader :error_code
|
6
|
+
|
7
|
+
def initialize(error_code:)
|
8
|
+
@error_code = error_code
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.decode(decoder)
|
12
|
+
_throttle_time_ms = decoder.int32
|
13
|
+
error_code = decoder.int16
|
14
|
+
new(error_code: error_code)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/kafka/snappy_codec.rb
CHANGED
data/lib/kafka/ssl_context.rb
CHANGED
@@ -57,6 +57,7 @@ module Kafka
|
|
57
57
|
|
58
58
|
# once that's connected, we can start initiating the ssl socket
|
59
59
|
@ssl_socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, ssl_context)
|
60
|
+
@ssl_socket.hostname = host
|
60
61
|
|
61
62
|
begin
|
62
63
|
# Initiate the socket connection in the background. If it doesn't fail
|
@@ -217,6 +217,31 @@ module Kafka
|
|
217
217
|
raise
|
218
218
|
end
|
219
219
|
|
220
|
+
def send_offsets_to_txn(offsets:, group_id:)
|
221
|
+
force_transactional!
|
222
|
+
|
223
|
+
unless @transaction_state.in_transaction?
|
224
|
+
raise 'Transaction is not valid to send offsets'
|
225
|
+
end
|
226
|
+
|
227
|
+
add_response = transaction_coordinator.add_offsets_to_txn(
|
228
|
+
transactional_id: @transactional_id,
|
229
|
+
producer_id: @producer_id,
|
230
|
+
producer_epoch: @producer_epoch,
|
231
|
+
group_id: group_id
|
232
|
+
)
|
233
|
+
Protocol.handle_error(add_response.error_code)
|
234
|
+
|
235
|
+
send_response = transaction_coordinator.txn_offset_commit(
|
236
|
+
transactional_id: @transactional_id,
|
237
|
+
group_id: group_id,
|
238
|
+
producer_id: @producer_id,
|
239
|
+
producer_epoch: @producer_epoch,
|
240
|
+
offsets: offsets
|
241
|
+
)
|
242
|
+
Protocol.handle_error(send_response.error_code)
|
243
|
+
end
|
244
|
+
|
220
245
|
def in_transaction?
|
221
246
|
@transaction_state.in_transaction?
|
222
247
|
end
|
data/lib/kafka/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kafka
|
4
|
+
class ZstdCodec
|
5
|
+
def codec_id
|
6
|
+
4
|
7
|
+
end
|
8
|
+
|
9
|
+
def produce_api_min_version
|
10
|
+
7
|
11
|
+
end
|
12
|
+
|
13
|
+
def load
|
14
|
+
require "zstd-ruby"
|
15
|
+
rescue LoadError
|
16
|
+
raise LoadError, "using zstd compression requires adding a dependency on the `zstd-ruby` gem to your Gemfile."
|
17
|
+
end
|
18
|
+
|
19
|
+
def compress(data)
|
20
|
+
Zstd.compress(data)
|
21
|
+
end
|
22
|
+
|
23
|
+
def decompress(data)
|
24
|
+
Zstd.decompress(data)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/ruby-kafka.gemspec
CHANGED
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
|
|
39
39
|
spec.add_development_dependency "activesupport"
|
40
40
|
spec.add_development_dependency "snappy"
|
41
41
|
spec.add_development_dependency "extlz4"
|
42
|
+
spec.add_development_dependency "zstd-ruby"
|
42
43
|
spec.add_development_dependency "colored"
|
43
44
|
spec.add_development_dependency "rspec_junit_formatter", "0.2.2"
|
44
45
|
spec.add_development_dependency "dogstatsd-ruby", ">= 3.0.0", "< 5.0.0"
|
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.7.
|
4
|
+
version: 0.7.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: digest-crc
|
@@ -164,6 +164,20 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: zstd-ruby
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: colored
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -361,6 +375,8 @@ files:
|
|
361
375
|
- lib/kafka/produce_operation.rb
|
362
376
|
- lib/kafka/producer.rb
|
363
377
|
- lib/kafka/protocol.rb
|
378
|
+
- lib/kafka/protocol/add_offsets_to_txn_request.rb
|
379
|
+
- lib/kafka/protocol/add_offsets_to_txn_response.rb
|
364
380
|
- lib/kafka/protocol/add_partitions_to_txn_request.rb
|
365
381
|
- lib/kafka/protocol/add_partitions_to_txn_response.rb
|
366
382
|
- lib/kafka/protocol/alter_configs_request.rb
|
@@ -416,6 +432,8 @@ files:
|
|
416
432
|
- lib/kafka/protocol/sasl_handshake_response.rb
|
417
433
|
- lib/kafka/protocol/sync_group_request.rb
|
418
434
|
- lib/kafka/protocol/sync_group_response.rb
|
435
|
+
- lib/kafka/protocol/txn_offset_commit_request.rb
|
436
|
+
- lib/kafka/protocol/txn_offset_commit_response.rb
|
419
437
|
- lib/kafka/round_robin_assignment_strategy.rb
|
420
438
|
- lib/kafka/sasl/gssapi.rb
|
421
439
|
- lib/kafka/sasl/oauth.rb
|
@@ -431,6 +449,7 @@ files:
|
|
431
449
|
- lib/kafka/transaction_manager.rb
|
432
450
|
- lib/kafka/transaction_state_machine.rb
|
433
451
|
- lib/kafka/version.rb
|
452
|
+
- lib/kafka/zstd_codec.rb
|
434
453
|
- lib/ruby-kafka.rb
|
435
454
|
- ruby-kafka.gemspec
|
436
455
|
homepage: https://github.com/zendesk/ruby-kafka
|