fleck 1.0.1 → 2.0.0
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/.gitignore +11 -10
- data/CHANGELOG.md +89 -74
- data/Gemfile +6 -4
- data/examples/actions.rb +59 -53
- data/examples/blocking_consumer.rb +42 -42
- data/examples/consumer_initialization.rb +44 -42
- data/examples/deprecation.rb +50 -57
- data/examples/example.rb +76 -74
- data/examples/expired.rb +72 -76
- data/examples/fanout.rb +62 -64
- data/fleck.gemspec +37 -36
- data/lib/fleck/client.rb +124 -124
- data/lib/fleck/configuration.rb +149 -144
- data/lib/fleck/consumer.rb +7 -287
- data/lib/fleck/core/consumer/action_param.rb +106 -0
- data/lib/fleck/core/consumer/actions.rb +76 -0
- data/lib/fleck/core/consumer/base.rb +111 -0
- data/lib/fleck/core/consumer/configuration.rb +69 -0
- data/lib/fleck/core/consumer/decorators.rb +77 -0
- data/lib/fleck/core/consumer/helpers_definers.rb +55 -0
- data/lib/fleck/core/consumer/logger.rb +88 -0
- data/lib/fleck/core/consumer/request.rb +89 -0
- data/lib/fleck/core/consumer/response.rb +77 -0
- data/lib/fleck/core/consumer/response_helpers.rb +81 -0
- data/lib/fleck/core/consumer/validation.rb +163 -0
- data/lib/fleck/core/consumer.rb +166 -0
- data/lib/fleck/core.rb +9 -0
- data/lib/fleck/loggable.rb +15 -10
- data/lib/fleck/{hash_with_indifferent_access.rb → utilities/hash_with_indifferent_access.rb} +80 -85
- data/lib/fleck/utilities/host_rating.rb +104 -0
- data/lib/fleck/version.rb +6 -3
- data/lib/fleck.rb +81 -72
- metadata +35 -24
- data/lib/fleck/consumer/request.rb +0 -52
- data/lib/fleck/consumer/response.rb +0 -80
- data/lib/fleck/host_rating.rb +0 -74
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fleck
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Groza Sergiu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.2.33
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.2.33
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,61 +53,61 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.9'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bunny
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '2.
|
61
|
+
version: '2.14'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '2.
|
68
|
+
version: '2.14'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: oj
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.10'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '3.10'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rainbow
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '2.2'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '2.2'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: thread_safe
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '3
|
103
|
+
version: '0.3'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '3
|
110
|
+
version: '0.3'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: ztimer
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,11 +157,22 @@ files:
|
|
157
157
|
- lib/fleck/client/response.rb
|
158
158
|
- lib/fleck/configuration.rb
|
159
159
|
- lib/fleck/consumer.rb
|
160
|
-
- lib/fleck/
|
161
|
-
- lib/fleck/consumer
|
162
|
-
- lib/fleck/
|
163
|
-
- lib/fleck/
|
160
|
+
- lib/fleck/core.rb
|
161
|
+
- lib/fleck/core/consumer.rb
|
162
|
+
- lib/fleck/core/consumer/action_param.rb
|
163
|
+
- lib/fleck/core/consumer/actions.rb
|
164
|
+
- lib/fleck/core/consumer/base.rb
|
165
|
+
- lib/fleck/core/consumer/configuration.rb
|
166
|
+
- lib/fleck/core/consumer/decorators.rb
|
167
|
+
- lib/fleck/core/consumer/helpers_definers.rb
|
168
|
+
- lib/fleck/core/consumer/logger.rb
|
169
|
+
- lib/fleck/core/consumer/request.rb
|
170
|
+
- lib/fleck/core/consumer/response.rb
|
171
|
+
- lib/fleck/core/consumer/response_helpers.rb
|
172
|
+
- lib/fleck/core/consumer/validation.rb
|
164
173
|
- lib/fleck/loggable.rb
|
174
|
+
- lib/fleck/utilities/hash_with_indifferent_access.rb
|
175
|
+
- lib/fleck/utilities/host_rating.rb
|
165
176
|
- lib/fleck/version.rb
|
166
177
|
homepage: https://github.com/serioja90/fleck
|
167
178
|
licenses:
|
@@ -175,14 +186,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
175
186
|
requirements:
|
176
187
|
- - ">="
|
177
188
|
- !ruby/object:Gem::Version
|
178
|
-
version: '2.
|
189
|
+
version: '2.5'
|
179
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
191
|
requirements:
|
181
192
|
- - ">="
|
182
193
|
- !ruby/object:Gem::Version
|
183
194
|
version: '0'
|
184
195
|
requirements: []
|
185
|
-
rubygems_version: 3.0.
|
196
|
+
rubygems_version: 3.0.8
|
186
197
|
signing_key:
|
187
198
|
specification_version: 4
|
188
199
|
summary: A Ruby gem for syncronous and asyncronous communication via Message Queue
|
@@ -1,52 +0,0 @@
|
|
1
|
-
|
2
|
-
module Fleck
|
3
|
-
class Consumer::Request
|
4
|
-
include Fleck::Loggable
|
5
|
-
|
6
|
-
attr_reader :id, :metadata, :payload, :action, :data, :headers, :action, :version, :ip, :params, :status, :errors
|
7
|
-
|
8
|
-
def initialize(metadata, payload, delivery_info)
|
9
|
-
@id = metadata.correlation_id
|
10
|
-
logger.progname += " #{@id}"
|
11
|
-
|
12
|
-
@metadata = metadata
|
13
|
-
@payload = payload
|
14
|
-
@exchange = delivery_info.exchange.inspect
|
15
|
-
@queue = delivery_info.routing_key.inspect
|
16
|
-
@data = {}
|
17
|
-
@headers = (@metadata.headers || {}).to_hash_with_indifferent_access
|
18
|
-
@action = @metadata.type
|
19
|
-
@version = nil
|
20
|
-
@ip = nil
|
21
|
-
@params = {}
|
22
|
-
@status = 200
|
23
|
-
@errors = []
|
24
|
-
|
25
|
-
parse_request!
|
26
|
-
end
|
27
|
-
|
28
|
-
protected
|
29
|
-
|
30
|
-
def parse_request!
|
31
|
-
@data = Oj.load(@payload, mode: :compat).to_hash_with_indifferent_access.filtered!
|
32
|
-
@headers.merge!(@data["headers"] || {}).filtered!
|
33
|
-
|
34
|
-
logger.debug "Processing request (exchange: #{@exchange}, queue: #{@queue}, options: #{@headers}, message: #{@data})"
|
35
|
-
|
36
|
-
@action ||= @headers["action"]
|
37
|
-
@headers["action"] ||= @action
|
38
|
-
@version = @headers["version"]
|
39
|
-
@ip = @headers["ip"]
|
40
|
-
@params = @data["params"] || {}
|
41
|
-
rescue Oj::ParseError => e
|
42
|
-
logger.error(e.inspect + "\n" + e.backtrace.join("\n"))
|
43
|
-
@status = 400
|
44
|
-
@errors << "Bad Request"
|
45
|
-
@errors << e.inspect
|
46
|
-
rescue => e
|
47
|
-
logger.error(e.inspect + "\n" + e.backtrace.join("\n"))
|
48
|
-
@status = 500
|
49
|
-
@errors << "Internal Server Error"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
|
2
|
-
module Fleck
|
3
|
-
class Consumer::Response
|
4
|
-
include Fleck::Loggable
|
5
|
-
|
6
|
-
attr_accessor :id, :status, :errors, :headers, :body
|
7
|
-
|
8
|
-
def initialize(request_id)
|
9
|
-
@id = request_id
|
10
|
-
logger.progname += " #{@id}"
|
11
|
-
|
12
|
-
@status = 200
|
13
|
-
@errors = []
|
14
|
-
@headers = {}
|
15
|
-
@body = nil
|
16
|
-
@rejected = false
|
17
|
-
@requeue = false
|
18
|
-
@deprecated = false
|
19
|
-
end
|
20
|
-
|
21
|
-
def reject!(requeue: false)
|
22
|
-
@rejected = true
|
23
|
-
@requeue = requeue
|
24
|
-
end
|
25
|
-
|
26
|
-
def rejected?
|
27
|
-
return @rejected
|
28
|
-
end
|
29
|
-
|
30
|
-
def requeue?
|
31
|
-
return @requeue
|
32
|
-
end
|
33
|
-
|
34
|
-
def deprecated!
|
35
|
-
@deprecated = true
|
36
|
-
end
|
37
|
-
|
38
|
-
def deprecated?
|
39
|
-
@deprecated
|
40
|
-
end
|
41
|
-
|
42
|
-
def not_found(msg = nil)
|
43
|
-
@status = 404
|
44
|
-
@errors << 'Resource Not Found'
|
45
|
-
@errors << msg if msg
|
46
|
-
end
|
47
|
-
|
48
|
-
def render_error(status, msg = [])
|
49
|
-
@status = status.to_i
|
50
|
-
if msg.is_a?(Array)
|
51
|
-
@errors += msg
|
52
|
-
else
|
53
|
-
@errors << msg
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def to_json(filter: false)
|
58
|
-
data = {
|
59
|
-
"status" => @status,
|
60
|
-
"errors" => @errors,
|
61
|
-
"headers" => @headers,
|
62
|
-
"body" => @body,
|
63
|
-
"deprecated" => @deprecated
|
64
|
-
}
|
65
|
-
data.filter! if filter
|
66
|
-
|
67
|
-
return Oj.dump(data, mode: :compat)
|
68
|
-
rescue => e
|
69
|
-
logger.error e.inspect + "\n" + e.backtrace.join("\n")
|
70
|
-
return Oj.dump({
|
71
|
-
"status" => 500,
|
72
|
-
"errors" => ['Internal Server Error', 'Failed to dump the response to JSON']
|
73
|
-
}, mode: :compat)
|
74
|
-
end
|
75
|
-
|
76
|
-
def to_s
|
77
|
-
return "#<#{self.class} #{self.to_json(filter: true)}>"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
data/lib/fleck/host_rating.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
require 'socket'
|
2
|
-
|
3
|
-
module Fleck
|
4
|
-
class HostRating
|
5
|
-
include Fleck::Loggable
|
6
|
-
|
7
|
-
CONN_TIMEOUT = 5
|
8
|
-
|
9
|
-
attr_reader :host, :port, :avg, :history
|
10
|
-
|
11
|
-
def initialize(host: 'localhost', port: 5672, refresh_rate: 30000, period: 300000)
|
12
|
-
@host = host
|
13
|
-
@port = port
|
14
|
-
@refresh_rate = refresh_rate
|
15
|
-
@period = period
|
16
|
-
|
17
|
-
# metrics
|
18
|
-
@reachable = false
|
19
|
-
@avg = 0
|
20
|
-
@updated_at = nil
|
21
|
-
@history = []
|
22
|
-
|
23
|
-
refresh!
|
24
|
-
@timer = Ztimer.every(@refresh_rate){ refresh! }
|
25
|
-
end
|
26
|
-
|
27
|
-
def reachable?
|
28
|
-
@reachable
|
29
|
-
end
|
30
|
-
|
31
|
-
def close
|
32
|
-
@timer.cancel!
|
33
|
-
end
|
34
|
-
|
35
|
-
def <=>(other_host)
|
36
|
-
return 1 if !self.reachable? && other_host.reachable? # the other host is reachable, so it comes first
|
37
|
-
return 0 if !(self.reachable? || other_host.reachable?) # both host are unreachable, so they have the same priority
|
38
|
-
return -1 if self.reachable? && !other_host.reachable? # the current host comes first, because it's reachable, while the other host is unreachable
|
39
|
-
|
40
|
-
# when both hosts are reachable, use avg latency to order them
|
41
|
-
return self.avg <=> other_host.avg
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def refresh!
|
47
|
-
# Get host info and open a new socket
|
48
|
-
addr = Socket.getaddrinfo(@host, nil)
|
49
|
-
sock_addr = Socket.pack_sockaddr_in(@port, addr[0][3])
|
50
|
-
socket = Socket.new(:AF_INET, :SOCK_STREAM, 0)
|
51
|
-
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
52
|
-
|
53
|
-
started_at = Time.now.to_f
|
54
|
-
begin
|
55
|
-
socket.connect_nonblock(sock_addr)
|
56
|
-
rescue IO::WaitWritable
|
57
|
-
IO.select(nil, [socket], nil, CONN_TIMEOUT) or raise Timeout::Error
|
58
|
-
end
|
59
|
-
latency = (Time.now.to_f - started_at) * 1000 # ms
|
60
|
-
socket.close
|
61
|
-
|
62
|
-
@history << latency
|
63
|
-
@history.shift if @history.size > @period / @refresh_rate
|
64
|
-
@avg = @history.inject(:+).to_f / @history.size
|
65
|
-
@reachable = true
|
66
|
-
rescue SocketError, Timeout::Error => e
|
67
|
-
socket.close if socket
|
68
|
-
@reachable = false
|
69
|
-
logger.error "Connection error: #{@host}:#{@port} (#{e.inspect})"
|
70
|
-
ensure
|
71
|
-
@updated_at = Time.now
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|