protobuf 1.1.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile.lock +44 -25
- data/README.md +2 -2
- data/Rakefile +15 -0
- data/bin/rpc_server +52 -11
- data/lib/protobuf.rb +22 -10
- data/lib/protobuf/common/logger.rb +26 -25
- data/lib/protobuf/descriptor/file_descriptor.rb +1 -1
- data/lib/protobuf/message/field.rb +2 -2
- data/lib/protobuf/rpc/buffer.rb +30 -25
- data/lib/protobuf/rpc/client.rb +8 -8
- data/lib/protobuf/rpc/connector.rb +2 -0
- data/lib/protobuf/rpc/connectors/base.rb +0 -1
- data/lib/protobuf/rpc/connectors/common.rb +48 -48
- data/lib/protobuf/rpc/connectors/em_client.rb +53 -27
- data/lib/protobuf/rpc/connectors/eventmachine.rb +14 -17
- data/lib/protobuf/rpc/connectors/socket.rb +23 -16
- data/lib/protobuf/rpc/connectors/zmq.rb +73 -0
- data/lib/protobuf/rpc/error.rb +1 -2
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/server.rb +31 -43
- data/lib/protobuf/rpc/servers/evented/server.rb +43 -0
- data/lib/protobuf/rpc/servers/evented_runner.rb +1 -1
- data/lib/protobuf/rpc/servers/socket/server.rb +108 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +59 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +3 -3
- data/lib/protobuf/rpc/servers/zmq/broker.rb +85 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +72 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -0
- data/lib/protobuf/rpc/service.rb +5 -5
- data/lib/protobuf/version.rb +1 -1
- data/protobuf.gemspec +12 -10
- data/spec/benchmark/tasks.rb +37 -5
- data/spec/functional/evented_server_spec.rb +64 -0
- data/spec/functional/socket_server_spec.rb +63 -0
- data/spec/functional/zmq_server_spec.rb +63 -0
- data/spec/helper/server.rb +32 -12
- data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
- data/spec/proto/test.pb.rb +3 -3
- data/spec/proto/test.proto +3 -3
- data/spec/proto/test_service.rb +1 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/unit/message_spec.rb +1 -1
- data/spec/unit/rpc/client_spec.rb +11 -3
- data/spec/unit/rpc/connectors/common_spec.rb +0 -1
- data/spec/unit/rpc/connectors/eventmachine_client_spec.rb +32 -0
- data/spec/unit/rpc/connectors/socket_spec.rb +2 -4
- data/spec/unit/rpc/connectors/zmq_spec.rb +27 -0
- data/spec/unit/rpc/servers/evented_server_spec.rb +3 -3
- data/spec/unit/rpc/servers/socket_server_spec.rb +14 -13
- data/spec/unit/rpc/servers/zmq/broker_spec.rb +27 -0
- data/spec/unit/rpc/servers/zmq/server_spec.rb +37 -0
- data/spec/unit/rpc/servers/zmq/util_spec.rb +41 -0
- data/spec/unit/rpc/servers/zmq/worker_spec.rb +36 -0
- data/spec/unit/rpc/service_spec.rb +22 -18
- metadata +87 -40
- data/lib/protobuf/rpc/servers/evented_server.rb +0 -28
- data/lib/protobuf/rpc/servers/socket_server.rb +0 -146
@@ -0,0 +1,59 @@
|
|
1
|
+
module Protobuf
|
2
|
+
module Rpc
|
3
|
+
module Socket
|
4
|
+
|
5
|
+
class Worker
|
6
|
+
include ::Protobuf::Rpc::Server
|
7
|
+
include ::Protobuf::Logger::LogMethods
|
8
|
+
|
9
|
+
def initialize(sock, &complete_cb)
|
10
|
+
@did_response = false
|
11
|
+
@socket = sock
|
12
|
+
@request = Protobuf::Socketrpc::Request.new
|
13
|
+
@response = Protobuf::Socketrpc::Response.new
|
14
|
+
request_buffer = Protobuf::Rpc::Buffer.new(:read)
|
15
|
+
@stats = Protobuf::Rpc::Stat.new(:SERVER, true)
|
16
|
+
@complete_cb = complete_cb
|
17
|
+
log_debug { "[#{log_signature}] Post init, new read buffer created" }
|
18
|
+
|
19
|
+
@stats.client = ::Socket.unpack_sockaddr_in(@socket.getpeername)
|
20
|
+
log_debug { "stats are #{@stats.to_s}" }
|
21
|
+
request_buffer << read_data
|
22
|
+
@request_data = request_buffer.data
|
23
|
+
|
24
|
+
@stats.request_size = request_buffer.size
|
25
|
+
|
26
|
+
log_debug { "[#{log_signature}] handling request" }
|
27
|
+
handle_client if request_buffer.flushed?
|
28
|
+
end
|
29
|
+
|
30
|
+
def log_signature
|
31
|
+
@log_signature ||= "server-#{self.class}-#{object_id}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def read_data
|
35
|
+
size_io = StringIO.new
|
36
|
+
|
37
|
+
while((size_reader = @socket.getc) != "-")
|
38
|
+
size_io << size_reader
|
39
|
+
end
|
40
|
+
str_size_io = size_io.string
|
41
|
+
|
42
|
+
"#{str_size_io}-#{@socket.read(str_size_io.to_i)}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def send_data
|
46
|
+
raise 'Socket closed unexpectedly' if(@socket.nil? || @socket.closed?)
|
47
|
+
response_buffer = Protobuf::Rpc::Buffer.new(:write)
|
48
|
+
response_buffer.set_data(@response)
|
49
|
+
@stats.response_size = response_buffer.size
|
50
|
+
log_debug { "[#{log_signature}] sending data : %s" % response_buffer.data }
|
51
|
+
@socket.write(response_buffer.write)
|
52
|
+
@socket.flush
|
53
|
+
@complete_cb.call(@socket)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -3,12 +3,12 @@ module Protobuf
|
|
3
3
|
class SocketRunner
|
4
4
|
|
5
5
|
def self.stop
|
6
|
-
Protobuf::Rpc::
|
6
|
+
Protobuf::Rpc::Socket::Server.stop
|
7
7
|
Protobuf::Logger.info 'Shutdown complete'
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.run(server)
|
11
|
-
Protobuf::Logger.info "
|
11
|
+
Protobuf::Logger.info "Socket::Server Running"
|
12
12
|
server_config = case
|
13
13
|
when server.is_a?(OpenStruct) then
|
14
14
|
server.marshal_dump
|
@@ -20,7 +20,7 @@ module Protobuf
|
|
20
20
|
raise "Cannot parser Socket Server - server options"
|
21
21
|
end
|
22
22
|
|
23
|
-
Protobuf::Rpc::
|
23
|
+
Protobuf::Rpc::Socket::Server.run(server_config)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'resolv'
|
2
|
+
require 'protobuf/rpc/servers/zmq/util'
|
3
|
+
|
4
|
+
module Protobuf
|
5
|
+
module Rpc
|
6
|
+
module Zmq
|
7
|
+
class Broker
|
8
|
+
include ::Protobuf::Rpc::Zmq::Util
|
9
|
+
attr_reader :frontend, :backend, :poller, :context
|
10
|
+
|
11
|
+
##
|
12
|
+
# Constructor
|
13
|
+
#
|
14
|
+
def initialize(opts={})
|
15
|
+
@context = ::ZMQ::Context.new
|
16
|
+
@frontend = setup_frontend(opts)
|
17
|
+
@backend = setup_backend(opts)
|
18
|
+
@poller = setup_poller
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Instance Methods
|
23
|
+
#
|
24
|
+
def poll
|
25
|
+
poller.poll(1000)
|
26
|
+
poller.readables.each do |socket|
|
27
|
+
case socket
|
28
|
+
when frontend then
|
29
|
+
move_to(backend, socket)
|
30
|
+
when backend then
|
31
|
+
move_to(frontend, socket)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def teardown
|
37
|
+
frontend.close
|
38
|
+
backend.close
|
39
|
+
context.terminate
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def move_to(frontend_or_backend, socket)
|
45
|
+
more_data = true
|
46
|
+
|
47
|
+
while more_data do
|
48
|
+
socket.recv_string(data = "")
|
49
|
+
more_data = socket.more_parts?
|
50
|
+
more_data_flag = (more_data ? ::ZMQ::SNDMORE : 0)
|
51
|
+
frontend_or_backend.send_string(data, more_data_flag)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup_backend(opts={})
|
56
|
+
dealer_options = opts.merge(:port => opts.fetch(:port, 9399) + 1)
|
57
|
+
host = dealer_options.fetch(:host, "127.0.0.1")
|
58
|
+
port = dealer_options.fetch(:port, 9400)
|
59
|
+
protocol = dealer_options.fetch(:protocol, "tcp")
|
60
|
+
|
61
|
+
zmq_backend = context.socket(::ZMQ::DEALER)
|
62
|
+
zmq_error_check(zmq_backend.bind("#{protocol}://#{resolve_ip(host)}:#{port}"))
|
63
|
+
zmq_backend
|
64
|
+
end
|
65
|
+
|
66
|
+
def setup_frontend(opts={})
|
67
|
+
host = opts.fetch(:host, "127.0.0.1")
|
68
|
+
port = opts.fetch(:port, 9399)
|
69
|
+
protocol = opts.fetch(:protocol, "tcp")
|
70
|
+
|
71
|
+
zmq_frontend = context.socket(::ZMQ::ROUTER)
|
72
|
+
zmq_error_check(zmq_frontend.bind("#{protocol}://#{resolve_ip(host)}:#{port}"))
|
73
|
+
zmq_frontend
|
74
|
+
end
|
75
|
+
|
76
|
+
def setup_poller
|
77
|
+
zmq_poller = ::ZMQ::Poller.new
|
78
|
+
zmq_poller.register(frontend, ::ZMQ::POLLIN)
|
79
|
+
zmq_poller.register(backend, ::ZMQ::POLLIN)
|
80
|
+
zmq_poller
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'protobuf/rpc/servers/zmq/broker'
|
2
|
+
require 'protobuf/rpc/servers/zmq/worker'
|
3
|
+
require 'protobuf/rpc/servers/zmq/util'
|
4
|
+
|
5
|
+
module Protobuf
|
6
|
+
module Rpc
|
7
|
+
module Zmq
|
8
|
+
class Server
|
9
|
+
include ::Protobuf::Rpc::Zmq::Util
|
10
|
+
|
11
|
+
##
|
12
|
+
# Class Methods
|
13
|
+
#
|
14
|
+
def self.run(opts = {})
|
15
|
+
log_debug { "[#{log_signature}] initializing broker" }
|
16
|
+
@broker = ::Protobuf::Rpc::Zmq::Broker.new(opts)
|
17
|
+
local_worker_threads = opts.fetch(:threads, 5)
|
18
|
+
|
19
|
+
worker_options = opts.merge(:port => opts.fetch(:port, 9399) + 1)
|
20
|
+
log_debug { "[#{log_signature}] starting server workers" }
|
21
|
+
local_worker_threads.times do
|
22
|
+
@threads << Thread.new { ::Protobuf::Rpc::Zmq::Worker.new(worker_options).run }
|
23
|
+
end
|
24
|
+
@running = true
|
25
|
+
|
26
|
+
log_debug { "[#{log_signature}] server started" }
|
27
|
+
while self.running? do
|
28
|
+
@broker.poll
|
29
|
+
end
|
30
|
+
ensure
|
31
|
+
@broker.teardown if @broker
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.running?
|
35
|
+
!!@running
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.stop
|
39
|
+
@running = false
|
40
|
+
|
41
|
+
@threads.each do |t|
|
42
|
+
t.join
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
@threads ||= []
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Protobuf
|
2
|
+
module Rpc
|
3
|
+
module Zmq
|
4
|
+
|
5
|
+
module Util
|
6
|
+
include ::Protobuf::Logger::LogMethods
|
7
|
+
def self.included(base)
|
8
|
+
base.extend(::Protobuf::Rpc::Zmq::Util)
|
9
|
+
end
|
10
|
+
|
11
|
+
def zmq_error_check(return_code)
|
12
|
+
raise "Last API call failed with \"#{::ZMQ::Util.error_string}\"#{$/}#{$/}#{caller(1)}" unless return_code >= 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def log_signature
|
16
|
+
@log_signature ||= "server-#{self.class}-#{object_id}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def resolve_ip(hostname)
|
20
|
+
::Resolv.getaddress(hostname)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'protobuf/rpc/server'
|
2
|
+
require 'protobuf/rpc/servers/zmq/util'
|
3
|
+
module Protobuf
|
4
|
+
module Rpc
|
5
|
+
module Zmq
|
6
|
+
|
7
|
+
class Worker
|
8
|
+
include ::Protobuf::Rpc::Server
|
9
|
+
include ::Protobuf::Rpc::Zmq::Util
|
10
|
+
|
11
|
+
##
|
12
|
+
# Constructor
|
13
|
+
#
|
14
|
+
def initialize(opts={})
|
15
|
+
|
16
|
+
@options = opts
|
17
|
+
host = @options.fetch(:host, "127.0.0.1")
|
18
|
+
port = @options.fetch(:port, 9400)
|
19
|
+
protocol = @options.fetch(:protocol, "tcp")
|
20
|
+
|
21
|
+
@zmq_context = ::ZMQ::Context.new
|
22
|
+
@socket = @zmq_context.socket(::ZMQ::REP)
|
23
|
+
zmq_error_check(@socket.connect("#{protocol}://#{resolve_ip(host)}:#{port}"))
|
24
|
+
|
25
|
+
@poller = ::ZMQ::Poller.new
|
26
|
+
@poller.register(@socket, ::ZMQ::POLLIN)
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Instance Methods
|
31
|
+
#
|
32
|
+
def handle_request(socket)
|
33
|
+
@request_data = ''
|
34
|
+
zmq_error_check(socket.recv_string(@request_data))
|
35
|
+
log_debug { "[#{log_signature}] handling request" } if(!@request_data.nil?)
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize_buffers
|
39
|
+
@did_respond = false
|
40
|
+
@request = ::Protobuf::Socketrpc::Request.new
|
41
|
+
@response = ::Protobuf::Socketrpc::Response.new
|
42
|
+
@stats = ::Protobuf::Rpc::Stat.new(:SERVER, true)
|
43
|
+
log_debug { "[#{log_signature}] Post init" }
|
44
|
+
end
|
45
|
+
|
46
|
+
def run
|
47
|
+
while ::Protobuf::Rpc::Zmq::Server.running? do
|
48
|
+
# poll for 1_000 milliseconds then continue looping
|
49
|
+
# This lets us see whether we need to die
|
50
|
+
@poller.poll(1_000)
|
51
|
+
@poller.readables.each do |socket|
|
52
|
+
initialize_buffers
|
53
|
+
handle_request(socket)
|
54
|
+
handle_client unless(@request_data.nil?)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
ensure
|
58
|
+
@socket.close
|
59
|
+
@zmq_context.terminate
|
60
|
+
end
|
61
|
+
|
62
|
+
def send_data
|
63
|
+
response_data = @response.is_a?(Protobuf::Message) ? @response.serialize_to_string : @response.to_s
|
64
|
+
@stats.response_size = response_data.size
|
65
|
+
zmq_error_check(@socket.send_string(response_data))
|
66
|
+
@did_respond = true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Protobuf
|
2
|
+
module Rpc
|
3
|
+
class ZmqRunner
|
4
|
+
|
5
|
+
def self.stop
|
6
|
+
Protobuf::Rpc::Zmq::Server.stop
|
7
|
+
Protobuf::Logger.info('Shutdown complete')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.run(server)
|
11
|
+
Protobuf::Logger.info "ZmqServer Running"
|
12
|
+
server_config = case
|
13
|
+
when server.is_a?(OpenStruct) then
|
14
|
+
server.marshal_dump
|
15
|
+
when server.respond_to?(:to_hash) then
|
16
|
+
server.to_hash
|
17
|
+
else
|
18
|
+
raise "Cannot parser Zmq Server - server options"
|
19
|
+
end
|
20
|
+
|
21
|
+
Protobuf::Rpc::Zmq::Server.run(server_config)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/protobuf/rpc/service.rb
CHANGED
@@ -130,7 +130,7 @@ module Protobuf
|
|
130
130
|
log_error exc.message
|
131
131
|
raise exc
|
132
132
|
else
|
133
|
-
log_error "-------------- [#{log_signature}] %s#%s not rpc method, passing to super" % [self.class.name, m.to_s]
|
133
|
+
log_error { "-------------- [#{log_signature}] %s#%s not rpc method, passing to super" % [self.class.name, m.to_s] }
|
134
134
|
super m, params
|
135
135
|
end
|
136
136
|
end
|
@@ -221,17 +221,17 @@ module Protobuf
|
|
221
221
|
# Setup the response
|
222
222
|
@response = rpcs[method].response_type.new
|
223
223
|
|
224
|
-
log_debug "[#{log_signature}] calling service method %s#%s" % [self.class, method]
|
224
|
+
log_debug { "[#{log_signature}] calling service method %s#%s" % [self.class, method] }
|
225
225
|
# Call the aliased rpc method (e.g. :rpc_find for :find)
|
226
226
|
__send__("rpc_#{method}".to_sym)
|
227
|
-
log_debug "[#{log_signature}] completed service method %s#%s" % [self.class, method]
|
227
|
+
log_debug { "[#{log_signature}] completed service method %s#%s" % [self.class, method] }
|
228
228
|
|
229
229
|
# Pass the populated response back to the server
|
230
230
|
# Note this will only get called if the rpc method didn't explode (by design)
|
231
231
|
if @async_responder
|
232
|
-
log_debug "[#{log_signature}] async request, not sending response (yet)"
|
232
|
+
log_debug { "[#{log_signature}] async request, not sending response (yet)" }
|
233
233
|
else
|
234
|
-
log_debug "[#{log_signature}] trigger server send_response"
|
234
|
+
log_debug { "[#{log_signature}] trigger server send_response" }
|
235
235
|
send_response
|
236
236
|
end
|
237
237
|
end
|
data/lib/protobuf/version.rb
CHANGED
data/protobuf.gemspec
CHANGED
@@ -12,19 +12,21 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.homepage = %q{https://github.com/localshred/protobuf}
|
13
13
|
s.summary = 'Ruby implementation for Protocol Buffers. Works with other protobuf rpc implementations (e.g. Java, Python, C++).'
|
14
14
|
s.description = s.summary + "\n\nThis gem has diverged from https://github.com/macks/ruby-protobuf. All credit for serialization and rprotoc work most certainly goes to the original authors. All RPC implementation code (client/server/service) was written and is maintained by this author. Attempts to reconcile the original codebase with the current RPC implementation went unsuccessful."
|
15
|
-
|
15
|
+
|
16
16
|
s.files = `git ls-files`.split("\n")
|
17
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
|
-
|
21
|
-
s.add_dependency 'eventmachine', '~> 0.12.10'
|
22
|
-
s.add_dependency 'eventually', '~> 0.1.0'
|
23
|
-
s.add_dependency 'json_pure', '~> 1.6.4'
|
24
20
|
|
25
|
-
s.
|
26
|
-
s.
|
27
|
-
s.
|
28
|
-
s.
|
29
|
-
|
21
|
+
s.add_dependency 'eventmachine'
|
22
|
+
s.add_dependency 'eventually'
|
23
|
+
s.add_dependency 'json_pure'
|
24
|
+
s.add_dependency 'ffi-rzmq'
|
25
|
+
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'pry'
|
28
|
+
s.add_development_dependency 'pry-nav'
|
29
|
+
s.add_development_dependency 'rspec'
|
30
|
+
s.add_development_dependency 'yard'
|
31
|
+
s.add_development_dependency 'simplecov'
|
30
32
|
end
|
data/spec/benchmark/tasks.rb
CHANGED
@@ -2,6 +2,13 @@ require 'benchmark'
|
|
2
2
|
require 'helper/all'
|
3
3
|
require 'proto/test_service_impl'
|
4
4
|
|
5
|
+
# Including a way to turn on debug logger for spec runs
|
6
|
+
if ENV["DEBUG"]
|
7
|
+
puts 'debugging'
|
8
|
+
debug_log = File.expand_path('../debug_bench.log', File.dirname(__FILE__) )
|
9
|
+
Protobuf::Logger.configure(:file => debug_log, :level => ::Logger::DEBUG)
|
10
|
+
end
|
11
|
+
|
5
12
|
namespace :benchmark do
|
6
13
|
include SilentConstants
|
7
14
|
|
@@ -37,7 +44,7 @@ namespace :benchmark do
|
|
37
44
|
EM.stop if EM.reactor_running?
|
38
45
|
|
39
46
|
EventMachine.fiber_run do
|
40
|
-
StubServer.new(:server => Protobuf::Rpc::
|
47
|
+
StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server|
|
41
48
|
client = Spec::Proto::TestService.client(:async => false, :port => 9399)
|
42
49
|
|
43
50
|
benchmark_wrapper(global_bench) do |bench|
|
@@ -54,7 +61,7 @@ namespace :benchmark do
|
|
54
61
|
def sock_client_sock_server(number_tests, test_length, global_bench = nil)
|
55
62
|
EM.stop if EM.reactor_running?
|
56
63
|
|
57
|
-
StubServer.new(:server => Protobuf::Rpc::
|
64
|
+
StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server|
|
58
65
|
with_constants "Protobuf::ClientType" => "Socket" do
|
59
66
|
client = Spec::Proto::TestService.client(:async => false, :port => 9399)
|
60
67
|
|
@@ -88,6 +95,30 @@ namespace :benchmark do
|
|
88
95
|
Thread.kill(em_thread) if em_thread
|
89
96
|
end
|
90
97
|
|
98
|
+
def zmq_client_zmq_server(number_tests, test_length, global_bench = nil)
|
99
|
+
require 'ffi-rzmq'
|
100
|
+
require 'protobuf/rpc/connectors/zmq'
|
101
|
+
require 'protobuf/rpc/servers/zmq/server'
|
102
|
+
StubServer.new(:port => 9399, :server => Protobuf::Rpc::Zmq::Server) do |server|
|
103
|
+
with_constants "Protobuf::ClientType" => "Zmq" do
|
104
|
+
client = Spec::Proto::TestService.client(:async => false, :port => 9399)
|
105
|
+
|
106
|
+
benchmark_wrapper(global_bench) do |bench|
|
107
|
+
bench.report("ZS / ZC") do
|
108
|
+
(1..number_tests.to_i).each { client.find(:name => "Test Name" * test_length.to_i, :active => true) }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
server.stop
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
desc "benchmark ZMQ client with ZMQ server"
|
117
|
+
task :zmq_client_zmq_server, [:number, :length] do |t, args|
|
118
|
+
args.with_defaults(:number => 1000, :length => 100)
|
119
|
+
zmq_client_zmq_server(args[:number], args[:length])
|
120
|
+
end
|
121
|
+
|
91
122
|
desc "benchmark EventMachine client with EventMachine server"
|
92
123
|
task :em_client_em_server, [:number, :length] do |t, args|
|
93
124
|
args.with_defaults(:number => 1000, :length => 100)
|
@@ -117,10 +148,11 @@ namespace :benchmark do
|
|
117
148
|
args.with_defaults(:number => 1000, :length => 100)
|
118
149
|
|
119
150
|
Benchmark.bm(10) do |bench|
|
120
|
-
|
121
|
-
|
151
|
+
# zmq_client_zmq_server(args[:number], args[:length], bench)
|
152
|
+
# em_client_em_server(args[:number], args[:length], bench)
|
153
|
+
# em_client_sock_server(args[:number], args[:length], bench)
|
122
154
|
sock_client_sock_server(args[:number], args[:length], bench)
|
123
|
-
sock_client_em_server(args[:number], args[:length], bench)
|
155
|
+
# sock_client_em_server(args[:number], args[:length], bench)
|
124
156
|
end
|
125
157
|
end
|
126
158
|
end
|