protein 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/protein.rb +31 -1
- data/lib/protein/amqp_adapter.rb +10 -3
- data/lib/protein/config.rb +5 -0
- data/lib/protein/get_const.rb +1 -1
- data/lib/protein/payload.rb +1 -0
- data/lib/protein/processor.rb +4 -4
- data/lib/protein/proto_compiler.rb +2 -0
- data/lib/protein/server.rb +1 -1
- data/lib/protein/service.rb +11 -3
- data/lib/protein/version.rb +1 -1
- metadata +50 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08b4bbb0ee5a01175aafd5859b0bc26135434114'
|
4
|
+
data.tar.gz: de4ab2913d794eb14b1779315e009e82eb4d6f7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f7f1b3d4996505ff18d68ae2aa8b634da35988a5fb8e8e0be898f1bbf0a7e20c29771774d5962833693a31275f5112a80df61772b9af10db39ba1329ecf5c50
|
7
|
+
data.tar.gz: 6d80c80bc0e95c9976e7c38288a628f14cb2cc5413307254cfff870e06013d8d809068b25d1d790f2e46a39be39c9894bf757bcd8b35ed94f77005fb712c6c66
|
data/lib/protein.rb
CHANGED
@@ -2,6 +2,7 @@ require "protein/errors"
|
|
2
2
|
require "protein/proto_compiler"
|
3
3
|
require "protein/get_const"
|
4
4
|
|
5
|
+
require "protein/config"
|
5
6
|
require "protein/router"
|
6
7
|
require "protein/client"
|
7
8
|
require "protein/server"
|
@@ -12,6 +13,35 @@ require "protein/pointer"
|
|
12
13
|
require "protein/service_error"
|
13
14
|
require "protein/service"
|
14
15
|
|
15
|
-
require "protein/transport"
|
16
16
|
require "protein/http_adapter"
|
17
17
|
require "protein/amqp_adapter"
|
18
|
+
require "protein/transport"
|
19
|
+
|
20
|
+
require "google/protobuf"
|
21
|
+
begin
|
22
|
+
require "bunny"
|
23
|
+
rescue LoadError
|
24
|
+
end
|
25
|
+
|
26
|
+
module Protein
|
27
|
+
class << self
|
28
|
+
def configure(&block)
|
29
|
+
new_config = Config.new
|
30
|
+
block.call(new_config)
|
31
|
+
@config = new_config
|
32
|
+
@config
|
33
|
+
end
|
34
|
+
|
35
|
+
def config
|
36
|
+
@config ||= Config.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def logger
|
40
|
+
@logger ||= begin
|
41
|
+
Logger.new($stdout).tap do |log|
|
42
|
+
log.progname = 'protein'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/protein/amqp_adapter.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "bunny"
|
2
|
+
require "securerandom"
|
2
3
|
require "thread"
|
3
4
|
|
4
5
|
module Protein
|
@@ -74,7 +75,7 @@ class AMQPAdapter
|
|
74
75
|
@q = @ch.queue(queue)
|
75
76
|
@x = @ch.default_exchange
|
76
77
|
|
77
|
-
|
78
|
+
Protein.logger.info "Connected to #{url}, serving RPC calls from #{queue}"
|
78
79
|
|
79
80
|
loop do
|
80
81
|
begin
|
@@ -95,10 +96,16 @@ class AMQPAdapter
|
|
95
96
|
|
96
97
|
@ch.ack(delivery_info.delivery_tag)
|
97
98
|
|
98
|
-
|
99
|
+
if @error
|
100
|
+
error_logger = Protein.config.error_logger
|
101
|
+
error_logger.call(@error) if error_logger
|
102
|
+
|
103
|
+
raise(@error)
|
104
|
+
end
|
99
105
|
end
|
100
106
|
rescue StandardError => e
|
101
|
-
|
107
|
+
Protein.logger.error "RPC server error: #{e.inspect}, restarting the server in 5s..."
|
108
|
+
|
102
109
|
sleep 5
|
103
110
|
end
|
104
111
|
end
|
data/lib/protein/get_const.rb
CHANGED
data/lib/protein/payload.rb
CHANGED
data/lib/protein/processor.rb
CHANGED
@@ -15,13 +15,13 @@ class Processor
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def process_and_log_call(service_name, service_class, request_buf)
|
18
|
-
|
18
|
+
Protein.logger.info "Processing RPC call: #{service_name}"
|
19
19
|
|
20
20
|
start_time = Time.now
|
21
21
|
response_buf, errors = process_call(service_class, request_buf)
|
22
22
|
duration_ms = ((Time.now - start_time) * 1000).round
|
23
23
|
|
24
|
-
|
24
|
+
Protein.logger.info "#{response_buf ? 'Resolved' : 'Rejected'} in #{duration_ms}ms"
|
25
25
|
|
26
26
|
Payload::Response.encode(response_buf, errors) if service_class.response?
|
27
27
|
end
|
@@ -44,13 +44,13 @@ class Processor
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def process_and_log_push(service_name, service_class, request_buf)
|
47
|
-
|
47
|
+
Protein.logger.info "Processing RPC push: #{service_name}"
|
48
48
|
|
49
49
|
start_time = Time.now
|
50
50
|
process_push(service_class, request_buf)
|
51
51
|
duration_ms = ((Time.now - start_time) * 1000).round
|
52
52
|
|
53
|
-
|
53
|
+
Protein.logger.info "Processed in #{duration_ms}ms"
|
54
54
|
|
55
55
|
nil
|
56
56
|
end
|
data/lib/protein/server.rb
CHANGED
@@ -34,7 +34,7 @@ class Server
|
|
34
34
|
|
35
35
|
if worker_count.is_a?(Integer) && worker_count > 1
|
36
36
|
Parallel.each(1..worker_count, in_processes: worker_count) do |worker|
|
37
|
-
|
37
|
+
Protein.logger.info "Starting server #{worker}/#{worker_count} with PID #{Process.pid}"
|
38
38
|
transport_class.serve(router)
|
39
39
|
end
|
40
40
|
else
|
data/lib/protein/service.rb
CHANGED
@@ -11,7 +11,8 @@ class Service
|
|
11
11
|
|
12
12
|
def proto(proto_module = nil)
|
13
13
|
@proto_module = proto_module
|
14
|
-
@service_name ||= proto_module.to_s.split("::").last.
|
14
|
+
@service_name ||= proto_module.to_s.split("::").last.
|
15
|
+
scan(/[A-Z][^A-Z]*/).map(&:downcase).join("_")
|
15
16
|
@request_class ||= "#{proto_module}::Request"
|
16
17
|
@response_class ||= "#{proto_module}::Response"
|
17
18
|
end
|
@@ -30,7 +31,7 @@ class Service
|
|
30
31
|
|
31
32
|
def response?
|
32
33
|
response_class != false &&
|
33
|
-
(!response_class.is_a?(String) || !response_class.
|
34
|
+
(!response_class.is_a?(String) || !(Object.const_get(response_class) rescue nil).nil?)
|
34
35
|
rescue NameError
|
35
36
|
false
|
36
37
|
end
|
@@ -45,12 +46,19 @@ class Service
|
|
45
46
|
end
|
46
47
|
|
47
48
|
attr_reader :request, :response, :errors
|
48
|
-
delegate :response?, :response_class, to: :class
|
49
49
|
|
50
50
|
def initialize(request)
|
51
51
|
@request = request
|
52
52
|
end
|
53
53
|
|
54
|
+
def response?
|
55
|
+
self.class.response?
|
56
|
+
end
|
57
|
+
|
58
|
+
def response_class
|
59
|
+
self.class.response_class
|
60
|
+
end
|
61
|
+
|
54
62
|
def process
|
55
63
|
@success = nil
|
56
64
|
@response = response_class.new if response?
|
data/lib/protein/version.rb
CHANGED
metadata
CHANGED
@@ -1,19 +1,62 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protein
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karol Słuszniak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bunny
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.0.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: google-protobuf
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.0'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 3.0.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '3.0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 3.0.0
|
13
53
|
- !ruby/object:Gem::Dependency
|
14
54
|
name: parallel
|
15
55
|
requirement: !ruby/object:Gem::Requirement
|
16
56
|
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.0'
|
17
60
|
- - ">="
|
18
61
|
- !ruby/object:Gem::Version
|
19
62
|
version: 1.0.0
|
@@ -21,6 +64,9 @@ dependencies:
|
|
21
64
|
prerelease: false
|
22
65
|
version_requirements: !ruby/object:Gem::Requirement
|
23
66
|
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.0'
|
24
70
|
- - ">="
|
25
71
|
- !ruby/object:Gem::Version
|
26
72
|
version: 1.0.0
|
@@ -35,6 +81,7 @@ files:
|
|
35
81
|
- lib/protein.rb
|
36
82
|
- lib/protein/amqp_adapter.rb
|
37
83
|
- lib/protein/client.rb
|
84
|
+
- lib/protein/config.rb
|
38
85
|
- lib/protein/errors.rb
|
39
86
|
- lib/protein/get_const.rb
|
40
87
|
- lib/protein/http_adapter.rb
|
@@ -68,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
115
|
version: '0'
|
69
116
|
requirements: []
|
70
117
|
rubyforge_project:
|
71
|
-
rubygems_version: 2.6.
|
118
|
+
rubygems_version: 2.6.14
|
72
119
|
signing_key:
|
73
120
|
specification_version: 4
|
74
121
|
summary: Multi-platform remote procedure call (RPC) system based on Protocol Buffers
|