delivery_boy 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/delivery_boy/config.rb +1 -0
- data/lib/delivery_boy/fake.rb +28 -0
- data/lib/delivery_boy/instance.rb +86 -0
- data/lib/delivery_boy/version.rb +1 -1
- data/lib/delivery_boy.rb +12 -57
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd80f951111ad29fdbf5ff8bbc02aef63b59d176
|
4
|
+
data.tar.gz: b9c6b8209940ef36ce24e8aec5261483100726bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddc0d55c7acb75817794d542c1ac132292c39d466f5d65ddc969f51c57815bd8e5951d9e12aa3391263c3bfc3312f4db86e814e13c905c8c790ef19155328070
|
7
|
+
data.tar.gz: 0ae524907b55be94d29b2c2849c87ea8d81ba28b80d8f94d9e0ff12822258ced4a0f9581e40e803db5557058b4ab58cf0905a5a8b01cd83e4a9883bd3fa0d00f
|
data/README.md
CHANGED
@@ -71,6 +71,8 @@ $ bundle exec rails generate delivery_boy:install
|
|
71
71
|
|
72
72
|
This will create a config file at `config/delivery_boy.yml` with configurations for each of your Rails environments. Open that file in order to make changes.
|
73
73
|
|
74
|
+
Note that for most configuration variables, you can pass in an environment variable. These environment variables all take the form `DELIVERY_BOY_X`, where `X` is the upper-case configuration variable name, e.g. `DELIVERY_BOY_CLIENT_ID`.
|
75
|
+
|
74
76
|
The following configuration variables can be set:
|
75
77
|
|
76
78
|
#### Basic
|
data/lib/delivery_boy/config.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
module DeliveryBoy
|
2
|
+
|
3
|
+
# A fake implementation that is useful for testing.
|
4
|
+
class Fake
|
5
|
+
FakeMessage = Struct.new(:value, :key, :topic, :partition, :partition_key)
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@messages = Hash.new {|h, k| h[k] = [] }
|
9
|
+
end
|
10
|
+
|
11
|
+
def deliver(value, topic:, **options)
|
12
|
+
message = FakeMessage.new(value: value, topic: topic, **options)
|
13
|
+
@messages[topic] << message
|
14
|
+
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
alias deliver_async! deliver
|
19
|
+
|
20
|
+
def shutdown
|
21
|
+
@messages.clear
|
22
|
+
end
|
23
|
+
|
24
|
+
def messages_for(topic)
|
25
|
+
@messages[topic]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module DeliveryBoy
|
2
|
+
|
3
|
+
# This class implements the actual logic of DeliveryBoy. The DeliveryBoy module
|
4
|
+
# has a module-level singleton instance.
|
5
|
+
class Instance
|
6
|
+
def initialize(config, logger)
|
7
|
+
@config = config
|
8
|
+
@logger = logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def deliver(value, topic:, **options)
|
12
|
+
sync_producer.produce(value, topic: topic, **options)
|
13
|
+
sync_producer.deliver_messages
|
14
|
+
rescue
|
15
|
+
# Make sure to clear any buffered messages if there's an error.
|
16
|
+
sync_producer.clear_buffer
|
17
|
+
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
|
21
|
+
def deliver_async!(value, topic:, **options)
|
22
|
+
async_producer.produce(value, topic: topic, **options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def shutdown
|
26
|
+
sync_producer.shutdown if sync_producer?
|
27
|
+
async_producer.shutdown if async_producer?
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :config, :logger
|
33
|
+
|
34
|
+
def sync_producer
|
35
|
+
# We want synchronous producers to be per-thread in order to avoid problems with
|
36
|
+
# concurrent deliveries.
|
37
|
+
Thread.current[:delivery_boy_sync_producer] ||= kafka.producer(**producer_options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def sync_producer?
|
41
|
+
Thread.current.key?(:delivery_boy_sync_producer)
|
42
|
+
end
|
43
|
+
|
44
|
+
def async_producer
|
45
|
+
# The async producer doesn't have to be per-thread, since all deliveries are
|
46
|
+
# performed by a single background thread.
|
47
|
+
@async_producer ||= kafka.async_producer(
|
48
|
+
max_queue_size: config.max_queue_size,
|
49
|
+
delivery_threshold: config.delivery_threshold,
|
50
|
+
delivery_interval: config.delivery_interval,
|
51
|
+
**producer_options,
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def async_producer?
|
56
|
+
!@async_producer.nil?
|
57
|
+
end
|
58
|
+
|
59
|
+
def kafka
|
60
|
+
@kafka ||= Kafka.new(
|
61
|
+
seed_brokers: config.brokers,
|
62
|
+
client_id: config.client_id,
|
63
|
+
logger: logger,
|
64
|
+
connect_timeout: config.connect_timeout,
|
65
|
+
socket_timeout: config.socket_timeout,
|
66
|
+
ssl_ca_cert: config.ssl_ca_cert,
|
67
|
+
ssl_client_cert: config.ssl_client_cert,
|
68
|
+
ssl_client_cert_key: config.ssl_client_cert_key,
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Options for both the sync and async producers.
|
73
|
+
def producer_options
|
74
|
+
{
|
75
|
+
required_acks: config.required_acks,
|
76
|
+
ack_timeout: config.ack_timeout,
|
77
|
+
max_retries: config.max_retries,
|
78
|
+
retry_backoff: config.retry_backoff,
|
79
|
+
max_buffer_size: config.max_buffer_size,
|
80
|
+
max_buffer_bytesize: config.max_buffer_bytesize,
|
81
|
+
compression_codec: config.compression_codec,
|
82
|
+
compression_threshold: config.compression_threshold,
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/delivery_boy/version.rb
CHANGED
data/lib/delivery_boy.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "logger"
|
2
2
|
require "kafka"
|
3
3
|
require "delivery_boy/version"
|
4
|
+
require "delivery_boy/instance"
|
5
|
+
require "delivery_boy/fake"
|
4
6
|
require "delivery_boy/config"
|
5
7
|
require "delivery_boy/railtie" if defined?(Rails)
|
6
8
|
|
@@ -23,13 +25,7 @@ module DeliveryBoy
|
|
23
25
|
# @raise [Kafka::BufferOverflow] if the producer's buffer is full.
|
24
26
|
# @raise [Kafka::DeliveryFailed] if delivery failed for some reason.
|
25
27
|
def deliver(value, topic:, **options)
|
26
|
-
|
27
|
-
sync_producer.deliver_messages
|
28
|
-
rescue
|
29
|
-
# Make sure to clear any buffered messages if there's an error.
|
30
|
-
sync_producer.clear_buffer
|
31
|
-
|
32
|
-
raise
|
28
|
+
instance.deliver(value, topic: topic, **options)
|
33
29
|
end
|
34
30
|
|
35
31
|
# Like {.deliver_async!}, but handles +Kafka::BufferOverflow+ errors
|
@@ -48,7 +44,7 @@ module DeliveryBoy
|
|
48
44
|
#
|
49
45
|
# @return [nil]
|
50
46
|
def deliver_async!(value, topic:, **options)
|
51
|
-
|
47
|
+
instance.deliver_async!(value, topic: topic, **options)
|
52
48
|
end
|
53
49
|
|
54
50
|
# Shut down DeliveryBoy.
|
@@ -57,8 +53,7 @@ module DeliveryBoy
|
|
57
53
|
#
|
58
54
|
# @return [nil]
|
59
55
|
def shutdown
|
60
|
-
|
61
|
-
async_producer.shutdown if async_producer?
|
56
|
+
instance.shutdown
|
62
57
|
end
|
63
58
|
|
64
59
|
# The logger used by DeliveryBoy.
|
@@ -77,58 +72,18 @@ module DeliveryBoy
|
|
77
72
|
@config ||= DeliveryBoy::Config.new(env: ENV)
|
78
73
|
end
|
79
74
|
|
80
|
-
|
81
|
-
|
82
|
-
def sync_producer
|
83
|
-
# We want synchronous producers to be per-thread in order to avoid problems with
|
84
|
-
# concurrent deliveries.
|
85
|
-
Thread.current[:delivery_boy_sync_producer] ||= kafka.producer(**producer_options)
|
86
|
-
end
|
87
|
-
|
88
|
-
def sync_producer?
|
89
|
-
Thread.current.key?(:delivery_boy_sync_producer)
|
75
|
+
def test_mode!
|
76
|
+
@instance = testing
|
90
77
|
end
|
91
78
|
|
92
|
-
def
|
93
|
-
|
94
|
-
# performed by a single background thread.
|
95
|
-
@async_producer ||= kafka.async_producer(
|
96
|
-
max_queue_size: config.max_queue_size,
|
97
|
-
delivery_threshold: config.delivery_threshold,
|
98
|
-
delivery_interval: config.delivery_interval,
|
99
|
-
**producer_options,
|
100
|
-
)
|
79
|
+
def testing
|
80
|
+
@testing ||= Fake.new
|
101
81
|
end
|
102
82
|
|
103
|
-
|
104
|
-
!@async_producer.nil?
|
105
|
-
end
|
106
|
-
|
107
|
-
def kafka
|
108
|
-
@kafka ||= Kafka.new(
|
109
|
-
seed_brokers: config.brokers,
|
110
|
-
client_id: config.client_id,
|
111
|
-
logger: logger,
|
112
|
-
connect_timeout: config.connect_timeout,
|
113
|
-
socket_timeout: config.socket_timeout,
|
114
|
-
ssl_ca_cert: config.ssl_ca_cert,
|
115
|
-
ssl_client_cert: config.ssl_client_cert,
|
116
|
-
ssl_client_cert_key: config.ssl_client_cert_key,
|
117
|
-
)
|
118
|
-
end
|
83
|
+
private
|
119
84
|
|
120
|
-
|
121
|
-
|
122
|
-
{
|
123
|
-
required_acks: config.required_acks,
|
124
|
-
ack_timeout: config.ack_timeout,
|
125
|
-
max_retries: config.max_retries,
|
126
|
-
retry_backoff: config.retry_backoff,
|
127
|
-
max_buffer_size: config.max_buffer_size,
|
128
|
-
max_buffer_bytesize: config.max_buffer_bytesize,
|
129
|
-
compression_codec: config.compression_codec,
|
130
|
-
compression_threshold: config.compression_threshold,
|
131
|
-
}
|
85
|
+
def instance
|
86
|
+
@instance ||= Instance.new(config, logger)
|
132
87
|
end
|
133
88
|
end
|
134
89
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delivery_boy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-kafka
|
@@ -90,6 +90,8 @@ files:
|
|
90
90
|
- lib/delivery_boy/config_error.rb
|
91
91
|
- lib/delivery_boy/config_file_loader.rb
|
92
92
|
- lib/delivery_boy/env_config_loader.rb
|
93
|
+
- lib/delivery_boy/fake.rb
|
94
|
+
- lib/delivery_boy/instance.rb
|
93
95
|
- lib/delivery_boy/railtie.rb
|
94
96
|
- lib/delivery_boy/version.rb
|
95
97
|
- lib/generators/delivery_boy/config_file.yml.erb
|