poseidon_cluster 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -4
- data/README.md +1 -1
- data/lib/poseidon/consumer_group.rb +33 -30
- data/poseidon_cluster.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54b28361ea6e2d74ad75503560e29230f928cf87
|
4
|
+
data.tar.gz: dce02dfed81efe6a59c210391d07c74cf3781083
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac690a44445aa513d2131339f8a7bb06dfe0e442d569e1389e1aa6959c01b80b5224dee4c8733aff41d2629803a847335a4a794ae8adb59ca5bd2f6c4a0b15cc
|
7
|
+
data.tar.gz: 117990bd5fd6badf2bdc9286ecba6d1ec0eaaca0b87ebaaf6fb385fae371d4669adc2527593d177ffe28caecf210f4af4049873e5d0e3ef1480ac9069405b17d
|
data/Gemfile.lock
CHANGED
@@ -7,7 +7,7 @@ GIT
|
|
7
7
|
PATH
|
8
8
|
remote: .
|
9
9
|
specs:
|
10
|
-
poseidon_cluster (0.1.
|
10
|
+
poseidon_cluster (0.1.1)
|
11
11
|
poseidon
|
12
12
|
zk
|
13
13
|
|
@@ -54,9 +54,6 @@ GEM
|
|
54
54
|
logging (~> 1.7.2)
|
55
55
|
zookeeper (~> 1.4.0)
|
56
56
|
zookeeper (1.4.8)
|
57
|
-
zookeeper (1.4.8-java)
|
58
|
-
slyphon-log4j (= 1.2.15)
|
59
|
-
slyphon-zookeeper_jar (= 3.3.5)
|
60
57
|
|
61
58
|
PLATFORMS
|
62
59
|
java
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Poseidon Cluster [![Build Status](https://travis-ci.org/bsm/poseidon_cluster.png?branch=master)](https://travis-ci.org/bsm/poseidon_cluster) [![Coverage Status](https://coveralls.io/repos/bsm/poseidon_cluster/badge.png)](https://coveralls.io/r/bsm/poseidon_cluster)
|
1
|
+
# Poseidon Cluster [![Build Status](https://travis-ci.org/bsm/poseidon_cluster.png?branch=master)](https://travis-ci.org/bsm/poseidon_cluster) [![Coverage Status](https://coveralls.io/repos/bsm/poseidon_cluster/badge.png?branch=master)](https://coveralls.io/r/bsm/poseidon_cluster?branch=master)
|
2
2
|
|
3
3
|
Poseidon Cluster is a cluster extension the excellent [Poseidon](http://github.com/bpot/poseidon) Ruby client for Kafka 0.8+. It implements the distribution concept of self-rebalancing *Consumer Groups* and supports the consumption of a single topic from multiple instances.
|
4
4
|
|
@@ -30,7 +30,7 @@ class Poseidon::ConsumerGroup
|
|
30
30
|
# @api private
|
31
31
|
class Consumer < ::Poseidon::PartitionConsumer
|
32
32
|
|
33
|
-
# @attr_reader [Integer] partition
|
33
|
+
# @attr_reader [Integer] partition consumer partition
|
34
34
|
attr_reader :partition
|
35
35
|
|
36
36
|
# @api private
|
@@ -158,10 +158,8 @@ class Poseidon::ConsumerGroup
|
|
158
158
|
# Closes the consumer group gracefully, only really useful in tests
|
159
159
|
# @api private
|
160
160
|
def close
|
161
|
-
|
162
|
-
|
163
|
-
zk.close
|
164
|
-
end
|
161
|
+
release_all!
|
162
|
+
zk.close
|
165
163
|
end
|
166
164
|
|
167
165
|
# @param [Integer] partition
|
@@ -222,18 +220,18 @@ class Poseidon::ConsumerGroup
|
|
222
220
|
#
|
223
221
|
# @api public
|
224
222
|
def checkout(opts = {})
|
225
|
-
@
|
226
|
-
consumer = @consumers.shift
|
227
|
-
break false unless consumer
|
223
|
+
return false if @rebalancing
|
228
224
|
|
229
|
-
|
230
|
-
|
225
|
+
consumer = @consumers.shift
|
226
|
+
return false unless consumer
|
231
227
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
228
|
+
@consumers.push(consumer)
|
229
|
+
result = yield(consumer)
|
230
|
+
|
231
|
+
unless opts[:commit] == false || result == false
|
232
|
+
commit consumer.partition, consumer.offset
|
236
233
|
end
|
234
|
+
true
|
237
235
|
end
|
238
236
|
|
239
237
|
# Convenience method to fetch messages from the broker.
|
@@ -360,19 +358,7 @@ class Poseidon::ConsumerGroup
|
|
360
358
|
# * let POS be our index position in CG and let N = size(PT)/size(CG)
|
361
359
|
# * assign partitions from POS*N to (POS+1)*N-1
|
362
360
|
def rebalance!
|
363
|
-
@mutex.synchronize
|
364
|
-
reload
|
365
|
-
release_all!
|
366
|
-
|
367
|
-
ids = zk.children(registries[:consumer], watch: true)
|
368
|
-
pms = partitions
|
369
|
-
rng = self.class.pick(pms.size, ids, id)
|
370
|
-
|
371
|
-
pms[rng].each do |pm|
|
372
|
-
consumer = claim!(pm.id)
|
373
|
-
@consumers.push(consumer)
|
374
|
-
end if rng
|
375
|
-
end
|
361
|
+
@mutex.synchronize { perform_rebalance! }
|
376
362
|
end
|
377
363
|
|
378
364
|
# Release all consumer claims
|
@@ -385,10 +371,10 @@ class Poseidon::ConsumerGroup
|
|
385
371
|
# @raise [Timeout::Error]
|
386
372
|
def claim!(partition)
|
387
373
|
path = claim_path(partition)
|
388
|
-
Timeout.timeout
|
389
|
-
sleep(0.
|
374
|
+
Timeout.timeout options[:claim_timout] || DEFAULT_CLAIM_TIMEOUT do
|
375
|
+
sleep(0.1) while zk.create(path, id, ephemeral: true, ignore: :node_exists).nil?
|
390
376
|
end
|
391
|
-
Consumer.new
|
377
|
+
Consumer.new self, partition, options.dup
|
392
378
|
end
|
393
379
|
|
394
380
|
# Release ownership of the partition
|
@@ -413,4 +399,21 @@ class Poseidon::ConsumerGroup
|
|
413
399
|
"#{registries[:consumer]}/#{id}"
|
414
400
|
end
|
415
401
|
|
402
|
+
def perform_rebalance!
|
403
|
+
@rebalancing = true
|
404
|
+
reload
|
405
|
+
release_all!
|
406
|
+
|
407
|
+
ids = zk.children(registries[:consumer], watch: true)
|
408
|
+
pms = partitions
|
409
|
+
rng = self.class.pick(pms.size, ids, id)
|
410
|
+
|
411
|
+
pms[rng].each do |pm|
|
412
|
+
consumer = claim!(pm.id)
|
413
|
+
@consumers.push(consumer)
|
414
|
+
end if rng
|
415
|
+
ensure
|
416
|
+
@rebalancing = nil
|
417
|
+
end
|
418
|
+
|
416
419
|
end
|
data/poseidon_cluster.gemspec
CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.name = File.basename(__FILE__, '.gemspec')
|
6
6
|
s.summary = "Poseidon cluster extensions"
|
7
7
|
s.description = "Cluster extensions for Poseidon, a producer and consumer implementation for Kafka >= 0.8"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.authors = ["Black Square Media"]
|
11
11
|
s.email = "info@blacksquaremedia.com"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poseidon_cluster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Black Square Media
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: poseidon
|
@@ -150,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
150
|
version: 1.8.0
|
151
151
|
requirements: []
|
152
152
|
rubyforge_project:
|
153
|
-
rubygems_version: 2.2.1
|
153
|
+
rubygems_version: 2.2.0.rc.1
|
154
154
|
signing_key:
|
155
155
|
specification_version: 4
|
156
156
|
summary: Poseidon cluster extensions
|