Elementary RPC is a basic Protobuf HTTP RPC gem which aims to provide:
- Easy RPC usage
- Parallelism by default
- An easily extended RPC request pipeline
For the following Protobuf RPC service definition:
package echoserv;
message String {
required string data = 1;
optional int64 status = 2;
}
service Simple {
rpc Echo (String) returns (String);
rpc Reverse (String) returns (String);
}
A corresponding Ruby client might look something like this:
require 'rubygems'
require 'elementary'
require 'echoserv/service.pb' # Include our protobuf object declarations
hosts = [{:host => 'localhost', :port => '9292', :prefix => '/rpcserv'}]
# Let's use the Statsd middleware to send RPC timing and count information to
# Graphite (this presumes we have already used `Statsd.create_instance` elsewhere
# in our code)
Elementary.use(Elementary::Middleware::Statsd, :client => Statsd.instance)
# Create our Connection object that knows about our Protobuf service
# definition
def connection
return @connection if @connection
@connection = Elementary::Connection.new(Echoserv::Simple,
:hosts => hosts)
end
# Create a Protobuf message to send over RPC
msg = Echoserv::String.new(:data => str)
echoed = c.rpc.echo(msg) # => Elementary::Future
reversed = c.rpc.reverse(msg) # => Elementary::Future
sleep 10 # Twiddle our thumbs doing other things
puts {
:echoed => echoed.value, # resolve the future and get our value out
:reversed => reversed.value,
}.to_json
Add this line to your application's Gemfile:
gem 'elementary-rpc'
And then execute:
$ bundle
Or install it yourself as:
$ gem install elementary-rpc
- Fork it ( https://github.com/[my-github-username]/elementary-rpc/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
Install ha-proxy for your OS For Mac OSX, good reference source is: http://nepalonrails.tumblr.com/post/9674428224/setup-haproxy-for-development-environment-on-mac
Sample ha-proxy config
>cat /etc/haproxy.conf
global
maxconn 4096
pidfile ~/tmp/haproxy-queue.pid
log /tmp/haproxy/log local0
log /tmp/haproxy/log local1 notice
defaults
log global
mode http
timeout connect 300000
timeout client 300000
timeout server 300000
maxconn 2000
option redispatch
retries 3
option httpclose
option httplog
option forwardfor
option httpchk HEAD / HTTP/1.0
frontend http-farm-1
bind :8080
default_backend app1latest
frontend http-farm-2
bind :8070
default_backend app2latest
backend app1latest
balance roundrobin
server localhost_8000 localhost:8000
backend app2latest
balance roundrobin
listen haproxyapp_admin:9100 127.0.0.1:9100
mode http
stats uri /
Start ha-proxy listener
haproxy -f /etc/haproxy.conf
Start the server hosting the rpc as below:
bundle exec rpc_server start ./spec/support/simpleservice.rb -p 8000 --http
Run the tests
bundle exec rspec spec