0mq

Works like ZeroMQ. Feels like Ruby.

Build Status Gem Version

A Ruby-like wrapper for ffi-rzmq-core (ZeroMQ)

Supported

Supported ZeroMQ (libzmq) versions:

  • 3.x

  • 4.x

Supported Ruby versions:

  • MRI >= 1.9

  • Rubinius 2.x

Feature Requests / Bug Reports

File them as issues or pull requests on the 0mq github repository.

Authors

  • Joe McIlvain

  • Alex McLain

Installation / Prerequisites

  • Requires the libzmq library.

  • PGM (multicast) requires compiling libzmq with ./configure --with-pgm

  • Curve cryptography requires compiling libzmq with libsodium.

ZeroMQ Documentation

Code Examples

Using The 0mq Gem

require '0mq'

Create A Socket

Sockets can be created by specifying the ZMQ socket type. Any errors will be raised as exceptions.

socket = ZMQ::Socket.new ZMQ::PULL
socket.connect 'tcp://127.0.0.1:10000'

Send And Receive Data

address = 'tcp://127.0.0.1:10000'

push = ZMQ::Socket.new ZMQ::PUSH
push.bind address

pull = ZMQ::Socket.new ZMQ::PULL
pull.connect address

push.send_string 'test'

string = pull.recv_string

puts string

Poll A Socket For Data

address = 'inproc://poll_example'

pull = ZMQ::Socket.new ZMQ::PULL
pull.bind address

# Push a message after a delay.
Thread.new do
  push = ZMQ::Socket.new ZMQ::PUSH
  push.connect address
  sleep 3

  push.send_string 'test'
end

# Check if pull has any data (it doesn't yet).
# (Non-blocking demonstration.)
result = ZMQ::Poll.poll_nonblock pull
puts "No data available yet." if result.empty?

# Do a blocking poll until the pull socket has data.
ZMQ::Poll.poll pull do |socket, event|
  puts socket.recv_string
end

Proxy Sockets

A proxy can be used to funnel multiple endpoints into a single connection. See: Pub-Sub Network with a Proxy

# ----------------     ----------------     ----------------     ----------------
# | Endpoint REQ | --> | Proxy ROUTER | --> | Proxy DEALER | --> | Endpoint REP |
# ----------------     ----------------     ----------------     ----------------

# Create sockets.
endpoint_req = ZMQ::Socket.new(ZMQ::REQ).tap    { |s| s.bind    'inproc://proxy_in'  }
proxy_router = ZMQ::Socket.new(ZMQ::ROUTER).tap { |s| s.connect 'inproc://proxy_in'  }
proxy_dealer = ZMQ::Socket.new(ZMQ::DEALER).tap { |s| s.bind    'inproc://proxy_out' }
endpoint_rep = ZMQ::Socket.new(ZMQ::REP).tap    { |s| s.connect 'inproc://proxy_out' }

# Create the proxy.
Thread.new { ZMQ::Proxy.proxy proxy_router, proxy_dealer }

# Send a message.
endpoint_req.send_string 'test'

puts endpoint_rep.recv_string