rpc-bench 0.0.1 → 0.1.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 +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
|