delivery_boy 0.1.4 → 0.1.5
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/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
|