rpc-bench 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +65 -23
- data/bin/rpc_bench +18 -0
- data/bin/rpc_bench_client +18 -0
- data/bin/rpc_bench_server +18 -0
- data/lib/rpc_bench.rb +9 -1
- data/lib/rpc_bench/client.rb +47 -0
- data/lib/rpc_bench/driver.rb +19 -0
- data/lib/rpc_bench/driver_grpc.rb +96 -0
- data/lib/rpc_bench/driver_rabbitmq.rb +64 -0
- data/lib/rpc_bench/driver_stomp.rb +48 -0
- data/lib/rpc_bench/driver_zmq.rb +62 -0
- data/lib/rpc_bench/options.rb +73 -0
- data/lib/rpc_bench/server.rb +28 -0
- data/lib/rpc_bench/version.rb +2 -2
- data/rpc_bench.gemspec +8 -1
- metadata +102 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 197357f01e80f24d1ff3999dc1f189116d1b6088
|
4
|
+
data.tar.gz: 3a9fb7dd595fcfa8786c472681b4388ecc04e94d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21e47f7cf5dfad36ebb8534225b260d32a72c21904b8793b3640d503d66b0fb5e2c09ba68b34b7d36004f5cb44a4fc0df89027b6a13934605d399a1df2f3ab1e
|
7
|
+
data.tar.gz: 4141e3a126c7ef3fc1ce9f0d1d2208c0961c3b8f19e958e5b02705db6f896031799f0983a261708cdfb82738bbdd68fb242ff18689b12c4f1514613beb6397bb
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,41 +1,83 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
1
|
+
# RPCBench
|
2
|
+
RPCBench is a simple benchmark tool for RabbitMQ(AMQP, STOMP), ZeroMQ, gRPC.
|
3
|
+
For benchmarking RPC using these middleware, RPCBench using following library.
|
6
4
|
|
7
5
|
## Installation
|
6
|
+
You have to install some libraries which client of RPCBench uses.
|
7
|
+
This explanes the procedure to install them on Ubuntu14.04.
|
8
8
|
|
9
|
-
|
9
|
+
### Install some packages
|
10
|
+
Some packages is needed to prepare following environment (e.g. building `libzmq` library).
|
11
|
+
```
|
12
|
+
$ sudo apt-get install protobuf-compiler autoconf rabbitmq-server libtool
|
13
|
+
```
|
10
14
|
|
11
|
-
|
12
|
-
|
15
|
+
### for gRPC
|
16
|
+
Here is a procedure to install Ruby gems to benchmark gRPC.
|
17
|
+
```
|
18
|
+
$ git clone https://github.com/grpc/grpc.git
|
19
|
+
$ cd grpc
|
20
|
+
$ bundle install
|
13
21
|
```
|
14
22
|
|
15
|
-
|
23
|
+
### for ZeroMQ
|
24
|
+
You have to install `libzmq` which is the library of ZeroMQ.
|
25
|
+
In this document, I'll show the procedure to install it from source code.
|
26
|
+
```
|
27
|
+
$ git clone git@github.com:zeromq/libzmq.git
|
28
|
+
$ autoreconf -i
|
29
|
+
$ ./configure; make
|
30
|
+
$ sudo make install
|
31
|
+
```
|
16
32
|
|
17
|
-
|
33
|
+
### for RabbitMQ (stomp)
|
34
|
+
To use rabbitmq-stomp plugin, you have to enable it from `rabbitmq-plugins` command like following and install Ruby gem of STOMP client.
|
35
|
+
```
|
36
|
+
$ sudo rabbitmq-plugins enable rabbitmq_stomp
|
37
|
+
$ gem install stomp
|
38
|
+
```
|
18
39
|
|
19
|
-
|
40
|
+
### RPCBench
|
41
|
+
Now, you have finished groundwork to benchmark using RPCBench.
|
42
|
+
Here is a way to install it.
|
20
43
|
|
21
|
-
|
44
|
+
```
|
45
|
+
$ gem install rpc_bench
|
46
|
+
```
|
22
47
|
|
23
48
|
## Usage
|
24
49
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
50
|
+
### Server
|
51
|
+
Here is the usage of server.
|
52
|
+
```
|
53
|
+
Usage: rpc_bench_server [options]
|
54
|
+
-m, --mode m specify benchmark mode {rabbitmq|rabbitmq-stomp|newtmq|zeromq|grpc} [default: rabbitmq]
|
55
|
+
-s, --server s specify server to send request
|
56
|
+
-p, --port p specify port number on which server listens
|
57
|
+
```
|
32
58
|
|
33
|
-
|
59
|
+
When you want to benchmark ZeroMQ, you execute `rpc_bench_server` command with `-m zeromq` which means 'ZeroMQ server mode'. And the parameter of `-p` means port number to listen.
|
60
|
+
```
|
61
|
+
$ rpc_bench_server -m zeromq -p 20000
|
62
|
+
```
|
34
63
|
|
35
|
-
|
64
|
+
### Client
|
65
|
+
Here is the usage of client.
|
66
|
+
```
|
67
|
+
Usage: rpc_bench_client [options]
|
68
|
+
-m, --mode m specify benchmark mode {rabbitmq|rabbitmq-stomp|newtmq|zeromq|grpc} [default: rabbitmq]
|
69
|
+
-s, --server s specify server to send request
|
70
|
+
-p, --port p specify port number on which server listens
|
71
|
+
-c, --concurrency c specify concurrent level [default: 10]
|
72
|
+
-n, --number n specify request number per thread [default: 100]
|
73
|
+
```
|
36
74
|
|
75
|
+
When you want to benchmark ZeroMQ, you do command `rpc_benchmark_client` command with `-m zeromq` in the same way.
|
76
|
+
Additionally, you can take some parameters that is `-c, --concurrency` and `-n, --number`.
|
77
|
+
The `--concurrency` means the number of threads to execute the processing to send request to server. And the `--number` means the number of requests to send request per thread.
|
78
|
+
```
|
79
|
+
$ rpc_bench_client -m zeromq -p 20000 -c 16 -n 50000
|
80
|
+
```
|
37
81
|
|
38
82
|
## License
|
39
|
-
|
40
83
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
41
|
-
|
data/bin/rpc_bench
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rpc_bench'
|
4
|
+
|
5
|
+
optobj = RPCBench::Options.new
|
6
|
+
|
7
|
+
begin
|
8
|
+
options = optobj.parse
|
9
|
+
rescue OptionParser::MissingArgument, OptionParser::InvalidOption => e
|
10
|
+
puts "[warning] failed to parse command line option (#{e})"
|
11
|
+
puts optobj.usage
|
12
|
+
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
|
16
|
+
client = RPCBench::Client.new(options)
|
17
|
+
|
18
|
+
client.run
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rpc_bench'
|
4
|
+
|
5
|
+
optobj = RPCBench::ClientOptions.new
|
6
|
+
|
7
|
+
begin
|
8
|
+
options = optobj.parse
|
9
|
+
rescue OptionParser::MissingArgument, OptionParser::InvalidOption => e
|
10
|
+
puts "[warning] failed to parse command line option (#{e})"
|
11
|
+
puts optobj.usage
|
12
|
+
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
|
16
|
+
client = RPCBench::Client.new(options)
|
17
|
+
|
18
|
+
client.run
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rpc_bench'
|
4
|
+
|
5
|
+
optobj = RPCBench::ServerOptions.new
|
6
|
+
|
7
|
+
begin
|
8
|
+
options = optobj.parse
|
9
|
+
rescue OptionParser::MissingArgument, OptionParser::InvalidOption => e
|
10
|
+
puts "[warning] failed to parse command line option (#{e})"
|
11
|
+
puts optobj.usage
|
12
|
+
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
|
16
|
+
server = RPCBench::Server.new(options)
|
17
|
+
|
18
|
+
server.run
|
data/lib/rpc_bench.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
require "rpc_bench/version"
|
2
|
+
require "rpc_bench/options"
|
3
|
+
require "rpc_bench/client"
|
4
|
+
require "rpc_bench/server"
|
5
|
+
require "rpc_bench/driver"
|
6
|
+
require "rpc_bench/driver_rabbitmq"
|
7
|
+
require "rpc_bench/driver_grpc"
|
8
|
+
require "rpc_bench/driver_zmq"
|
9
|
+
require "rpc_bench/driver_stomp"
|
2
10
|
|
3
|
-
module
|
11
|
+
module RPCBench
|
4
12
|
# Your code goes here...
|
5
13
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module RPCBench
|
2
|
+
class Client
|
3
|
+
def initialize(opts)
|
4
|
+
@bench_conc = opts[:conc]
|
5
|
+
@bench_num = opts[:num]
|
6
|
+
|
7
|
+
case opts[:mode]
|
8
|
+
when 'rabbitmq'
|
9
|
+
@driver = RabbitMQ::Client.new opts
|
10
|
+
when 'grpc'
|
11
|
+
@driver = GRPC::Client.new opts
|
12
|
+
when 'zeromq'
|
13
|
+
@driver = ZeroMQ::Client.new opts
|
14
|
+
when 'stomp'
|
15
|
+
@driver = Stomp::Client.new opts
|
16
|
+
else
|
17
|
+
raise RuntimeError.new("failed to initialize driver of '#{opts[:mode]}'")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def validate? results
|
22
|
+
results.all? {|x| x == 2}
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
t_start = Time.now
|
27
|
+
|
28
|
+
threads = []
|
29
|
+
(1..@bench_conc).each do |x|
|
30
|
+
threads << Thread.new do
|
31
|
+
@driver.send(1, @bench_num)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
results = threads.map(&:value).flatten
|
36
|
+
unless(validate? results)
|
37
|
+
puts "[error] failed to get accurate result"
|
38
|
+
end
|
39
|
+
|
40
|
+
@driver.close
|
41
|
+
|
42
|
+
t_end = Time.now
|
43
|
+
|
44
|
+
puts "Time: #{t_end - t_start}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RPCBench
|
2
|
+
class Driver
|
3
|
+
def set_handler handler
|
4
|
+
@handler = handler
|
5
|
+
end
|
6
|
+
|
7
|
+
def send(data, count)
|
8
|
+
begin
|
9
|
+
send_request(data, count)
|
10
|
+
rescue NameError => e
|
11
|
+
puts "[warning] failed to send request (#{e})"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def close
|
16
|
+
# nop
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'protobuf/message'
|
2
|
+
require 'protobuf/rpc/service'
|
3
|
+
|
4
|
+
require 'grpc'
|
5
|
+
require 'thread'
|
6
|
+
|
7
|
+
module RPCBench
|
8
|
+
module GRPC
|
9
|
+
SERVICE_NAME = 'rpc_bench'
|
10
|
+
|
11
|
+
##
|
12
|
+
# Message Fields
|
13
|
+
#
|
14
|
+
class TmpRequest < Protobuf::Message
|
15
|
+
required :int32, :num, 1
|
16
|
+
end
|
17
|
+
class TmpReply < Protobuf::Message
|
18
|
+
required :int32, :num, 1
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Service Classes
|
23
|
+
#
|
24
|
+
class ServiceCalc < Protobuf::Rpc::Service
|
25
|
+
rpc :calc_tmp, TmpRequest, TmpReply
|
26
|
+
end
|
27
|
+
|
28
|
+
class Calc
|
29
|
+
class Service
|
30
|
+
include ::GRPC::GenericService
|
31
|
+
|
32
|
+
self.marshal_class_method = :encode
|
33
|
+
self.unmarshal_class_method = :decode
|
34
|
+
self.service_name = SERVICE_NAME
|
35
|
+
|
36
|
+
rpc :CalcTmp, TmpRequest, TmpReply
|
37
|
+
end
|
38
|
+
Stub = Service.rpc_stub_class
|
39
|
+
end
|
40
|
+
|
41
|
+
class Client < Driver
|
42
|
+
def initialize opts
|
43
|
+
@opts = opts
|
44
|
+
end
|
45
|
+
|
46
|
+
def sendmsg stub, data
|
47
|
+
begin
|
48
|
+
stub.calc_tmp(RPCBench::GRPC::TmpRequest.new(num: data)).num
|
49
|
+
rescue ::GRPC::BadStatus => e
|
50
|
+
if(e.code == 8)
|
51
|
+
sendmsg stub, data
|
52
|
+
else
|
53
|
+
puts "[warning] other error is occurrs"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def send_request(data, count)
|
59
|
+
stub = RPCBench::GRPC::Calc::Stub.new("#{@opts[:host]}:#{@opts[:port]}", :this_channel_is_insecure)
|
60
|
+
|
61
|
+
results = []
|
62
|
+
(1..count).each do |_|
|
63
|
+
results << sendmsg(stub, data)
|
64
|
+
end
|
65
|
+
|
66
|
+
results
|
67
|
+
end
|
68
|
+
end
|
69
|
+
class Server < Driver
|
70
|
+
@@handler = nil
|
71
|
+
|
72
|
+
def initialize opts
|
73
|
+
@opts = opts
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.handler
|
77
|
+
@@handler
|
78
|
+
end
|
79
|
+
|
80
|
+
def run
|
81
|
+
@@handler = @handler
|
82
|
+
|
83
|
+
s = ::GRPC::RpcServer.new
|
84
|
+
s.add_http2_port("#{@opts[:host]}:#{@opts[:port]}", :this_port_is_insecure)
|
85
|
+
s.handle(MyCalc)
|
86
|
+
s.run_till_terminated
|
87
|
+
end
|
88
|
+
|
89
|
+
class MyCalc < RPCBench::GRPC::Calc::Service
|
90
|
+
def calc_tmp(value, obj)
|
91
|
+
TmpReply.new(num: RPCBench::GRPC::Server.handler.callback(value.num))
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'bunny'
|
2
|
+
|
3
|
+
module RPCBench
|
4
|
+
module RabbitMQ
|
5
|
+
QNAME = 'rpc_queue'
|
6
|
+
|
7
|
+
class Client < Driver
|
8
|
+
def initialize opts
|
9
|
+
@opts = opts
|
10
|
+
end
|
11
|
+
|
12
|
+
def send_request data, count
|
13
|
+
results = []
|
14
|
+
|
15
|
+
conn = Bunny.new(host: @opts[:host], port: @opts[:port])
|
16
|
+
conn.start
|
17
|
+
|
18
|
+
ch = conn.create_channel
|
19
|
+
exchange = ch.default_exchange
|
20
|
+
|
21
|
+
reply_queue = ch.queue("", :exclusive => true)
|
22
|
+
(1..count).each do |_|
|
23
|
+
exchange.publish(data.to_s, :routing_key => RPCBench::RabbitMQ::QNAME, :reply_to => reply_queue.name)
|
24
|
+
end
|
25
|
+
|
26
|
+
reply_queue.subscribe(:block => true) do |dinfo, _, data|
|
27
|
+
results << data.to_i
|
28
|
+
|
29
|
+
if results.size >= count
|
30
|
+
dinfo.consumer.cancel
|
31
|
+
break
|
32
|
+
end
|
33
|
+
end
|
34
|
+
ch.close
|
35
|
+
conn.close
|
36
|
+
|
37
|
+
results
|
38
|
+
end
|
39
|
+
end
|
40
|
+
class Server < Driver
|
41
|
+
def initialize opts
|
42
|
+
@opts = opts
|
43
|
+
end
|
44
|
+
|
45
|
+
def run
|
46
|
+
conn = Bunny.new(host: @opts[:host], port: @opts[:port])
|
47
|
+
conn.start
|
48
|
+
|
49
|
+
ch = conn.create_channel
|
50
|
+
|
51
|
+
queue = ch.queue RPCBench::RabbitMQ::QNAME
|
52
|
+
exchange = ch.default_exchange
|
53
|
+
queue.subscribe(:block => true) do |_, attr, data|
|
54
|
+
resp = @handler.callback(data.to_i)
|
55
|
+
|
56
|
+
exchange.publish(resp.to_s, :routing_key => attr.reply_to, :correlation_id => attr.correlation_id)
|
57
|
+
end
|
58
|
+
|
59
|
+
ch.close
|
60
|
+
conn.close
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'stomp'
|
2
|
+
|
3
|
+
module RPCBench
|
4
|
+
module Stomp
|
5
|
+
QNAME = '/queue/rpc-bench'
|
6
|
+
|
7
|
+
class Client < Driver
|
8
|
+
TEMP_QNAME = '/temp-queue/rpc-bench'
|
9
|
+
def initialize opts
|
10
|
+
@opts = opts
|
11
|
+
end
|
12
|
+
|
13
|
+
def send_request data, count
|
14
|
+
results = []
|
15
|
+
|
16
|
+
conn = ::Stomp::Connection.open('guest', 'guest', @opts[:host], @opts[:port])
|
17
|
+
(1..count).each do |x|
|
18
|
+
conn.publish(RPCBench::Stomp::QNAME, data.to_s, {
|
19
|
+
'reply-to' => TEMP_QNAME
|
20
|
+
})
|
21
|
+
end
|
22
|
+
(1..count).each do |_|
|
23
|
+
results << conn.receive.body.slice(/[0-9]*/).to_i
|
24
|
+
end
|
25
|
+
conn.disconnect
|
26
|
+
|
27
|
+
results
|
28
|
+
end
|
29
|
+
end
|
30
|
+
class Server < Driver
|
31
|
+
def initialize opts
|
32
|
+
@opts = opts
|
33
|
+
end
|
34
|
+
|
35
|
+
def run
|
36
|
+
conn = ::Stomp::Connection.open('guest', 'guest', @opts[:host], @opts[:port])
|
37
|
+
|
38
|
+
conn.subscribe RPCBench::Stomp::QNAME
|
39
|
+
loop do
|
40
|
+
msg = conn.receive
|
41
|
+
reply = @handler.callback(msg.body.to_i)
|
42
|
+
|
43
|
+
conn.publish(msg.headers['reply-to'], reply.to_s)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'ffi-rzmq'
|
2
|
+
|
3
|
+
module RPCBench
|
4
|
+
module ZeroMQ
|
5
|
+
class Base < Driver
|
6
|
+
def initialize opts
|
7
|
+
@opts = opts
|
8
|
+
@context = ZMQ::Context.new
|
9
|
+
end
|
10
|
+
end
|
11
|
+
class Client < Base
|
12
|
+
def initialize opts
|
13
|
+
super opts
|
14
|
+
end
|
15
|
+
|
16
|
+
def send_request data, count
|
17
|
+
sock = @context.socket(ZMQ::REQ)
|
18
|
+
sock.connect("tcp://#{@opts[:host]}:#{@opts[:port]}")
|
19
|
+
|
20
|
+
results = []
|
21
|
+
(1..count).each do |_|
|
22
|
+
# sending request
|
23
|
+
sock.send_string data.to_s
|
24
|
+
|
25
|
+
# receiving reply
|
26
|
+
reply = ''
|
27
|
+
sock.recv_string(reply)
|
28
|
+
|
29
|
+
results << reply.slice(/[0-9]+/).to_i
|
30
|
+
end
|
31
|
+
sock.close
|
32
|
+
|
33
|
+
results
|
34
|
+
end
|
35
|
+
|
36
|
+
def close
|
37
|
+
@context.terminate
|
38
|
+
end
|
39
|
+
end
|
40
|
+
class Server < Base
|
41
|
+
def initialize opts
|
42
|
+
super opts
|
43
|
+
end
|
44
|
+
|
45
|
+
def run
|
46
|
+
sock = @context.socket(ZMQ::REP)
|
47
|
+
sock.bind("tcp://*:#{@opts[:port]}")
|
48
|
+
|
49
|
+
loop do
|
50
|
+
request = ''
|
51
|
+
|
52
|
+
sock.recv_string(request)
|
53
|
+
|
54
|
+
data = request.inspect.slice(/[0-9]+/).to_i
|
55
|
+
|
56
|
+
# Send reply back to client
|
57
|
+
sock.send_string(@handler.callback(data).to_s)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
module RPCBench
|
4
|
+
class Options
|
5
|
+
MODE_VALUES = ['rabbitmq', 'stomp', 'zeromq', 'grpc']
|
6
|
+
|
7
|
+
OPT_DEFAULT = {
|
8
|
+
:host => 'localhost',
|
9
|
+
:port => 5672,
|
10
|
+
:mode => 'rabbitmq',
|
11
|
+
}
|
12
|
+
def initialize
|
13
|
+
def sets(key, short, long, desc)
|
14
|
+
@opt.on(short, long, desc) {|v| @options[key] = v}
|
15
|
+
end
|
16
|
+
def setn(key, short, long, desc)
|
17
|
+
@opt.on(short, long, desc) {|v| @options[key] = v.to_i}
|
18
|
+
end
|
19
|
+
|
20
|
+
@options = OPT_DEFAULT
|
21
|
+
@opt = OptionParser.new
|
22
|
+
|
23
|
+
sets(:mode, '-m', '--mode m',
|
24
|
+
'specify benchmark mode {rabbitmq|rabbitmq-stomp|newtmq|zeromq|grpc} [default: rabbitmq]')
|
25
|
+
sets(:host, '-s', '--server s',
|
26
|
+
'specify server to send request')
|
27
|
+
setn(:port, '-p', '--port p',
|
28
|
+
'specify port number on which server listens')
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse
|
32
|
+
@opt.parse!(ARGV)
|
33
|
+
|
34
|
+
raise OptionParser::InvalidOption.new('validation failed') unless validated?
|
35
|
+
|
36
|
+
@options
|
37
|
+
end
|
38
|
+
|
39
|
+
def usage
|
40
|
+
@opt.help
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def validated?
|
45
|
+
ret = true
|
46
|
+
|
47
|
+
ret &= MODE_VALUES.include? @options[:mode]
|
48
|
+
ret &= @options[:conc].is_a? Integer
|
49
|
+
ret &= @options[:num].is_a? Integer
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class ServerOptions < Options
|
54
|
+
def initialize
|
55
|
+
super
|
56
|
+
end
|
57
|
+
end
|
58
|
+
class ClientOptions < Options
|
59
|
+
OPT_DEFAULT.merge!({
|
60
|
+
:conc => 10,
|
61
|
+
:num => 100,
|
62
|
+
})
|
63
|
+
|
64
|
+
def initialize
|
65
|
+
super
|
66
|
+
|
67
|
+
setn(:conc, '-c', '--concurrency c',
|
68
|
+
'specify concurrent level [default: 10]')
|
69
|
+
setn(:num, '-n', '--number n',
|
70
|
+
'specify request number per thread [default: 100]')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RPCBench
|
2
|
+
class Server
|
3
|
+
def initialize(opts)
|
4
|
+
case opts[:mode]
|
5
|
+
when 'rabbitmq'
|
6
|
+
@driver = RabbitMQ::Server.new opts
|
7
|
+
when 'grpc'
|
8
|
+
@driver = GRPC::Server.new opts
|
9
|
+
when 'zeromq'
|
10
|
+
@driver = ZeroMQ::Server.new opts
|
11
|
+
when 'stomp'
|
12
|
+
@driver = Stomp::Server.new opts
|
13
|
+
else
|
14
|
+
raise RuntimeError.new("failed to initialize driver of '#{opts[:mode]}'")
|
15
|
+
end
|
16
|
+
|
17
|
+
@driver.set_handler self
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
@driver.run
|
22
|
+
end
|
23
|
+
|
24
|
+
def callback(v)
|
25
|
+
v.to_i + 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/rpc_bench/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.0
|
1
|
+
module RPCBench
|
2
|
+
VERSION = "0.1.0"
|
3
3
|
end
|
data/rpc_bench.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'rpc_bench/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "rpc-bench"
|
8
|
-
spec.version =
|
8
|
+
spec.version = RPCBench::VERSION
|
9
9
|
spec.authors = ["Hiroyasu OHYAMA"]
|
10
10
|
spec.email = ["user.localhost2000@gmail.com"]
|
11
11
|
|
@@ -17,4 +17,11 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.bindir = "bin"
|
18
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "grpc", "0.14.1"
|
22
|
+
spec.add_runtime_dependency "grpc-tools", "0.14.1"
|
23
|
+
spec.add_runtime_dependency "stomp", "1.4.0"
|
24
|
+
spec.add_runtime_dependency "bunny", "2.3.1"
|
25
|
+
spec.add_runtime_dependency "ffi-rzmq", "2.0.4"
|
26
|
+
spec.add_runtime_dependency "protobuf", "3.6.9"
|
20
27
|
end
|
metadata
CHANGED
@@ -1,19 +1,106 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rpc-bench
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroyasu OHYAMA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
12
|
-
dependencies:
|
11
|
+
date: 2016-06-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: grpc
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.14.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.14.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: grpc-tools
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.14.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.14.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: stomp
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.4.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.4.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bunny
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.3.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.3.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ffi-rzmq
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.0.4
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.0.4
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: protobuf
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 3.6.9
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.6.9
|
13
97
|
description:
|
14
98
|
email:
|
15
99
|
- user.localhost2000@gmail.com
|
16
|
-
executables:
|
100
|
+
executables:
|
101
|
+
- rpc_bench
|
102
|
+
- rpc_bench_client
|
103
|
+
- rpc_bench_server
|
17
104
|
extensions: []
|
18
105
|
extra_rdoc_files: []
|
19
106
|
files:
|
@@ -23,7 +110,18 @@ files:
|
|
23
110
|
- LICENSE.txt
|
24
111
|
- README.md
|
25
112
|
- Rakefile
|
113
|
+
- bin/rpc_bench
|
114
|
+
- bin/rpc_bench_client
|
115
|
+
- bin/rpc_bench_server
|
26
116
|
- lib/rpc_bench.rb
|
117
|
+
- lib/rpc_bench/client.rb
|
118
|
+
- lib/rpc_bench/driver.rb
|
119
|
+
- lib/rpc_bench/driver_grpc.rb
|
120
|
+
- lib/rpc_bench/driver_rabbitmq.rb
|
121
|
+
- lib/rpc_bench/driver_stomp.rb
|
122
|
+
- lib/rpc_bench/driver_zmq.rb
|
123
|
+
- lib/rpc_bench/options.rb
|
124
|
+
- lib/rpc_bench/server.rb
|
27
125
|
- lib/rpc_bench/version.rb
|
28
126
|
- rpc_bench.gemspec
|
29
127
|
homepage: https://github.com/userlocalhost2000/rpc_bench
|