CZTop

March 17, 2026 · View on GitHub

CI Gem Version License: ISC Ruby

Ruby FFI binding for CZMQ / ZeroMQ — high-performance asynchronous messaging for distributed systems.

353k msg/s inproc throughput | 49 µs fiber roundtrip latency | nonblock fast path


Highlights

  • All socket types — req/rep, pub/sub, push/pull, dealer/router, xpub/xsub, pair, stream
  • Async-first — first-class async fiber support, also works with plain threads
  • Ruby-idiomatic API — messages as Array<String>, errors as exceptions, timeouts as IO::TimeoutError

Install

Install CZMQ on your system:

# Debian/Ubuntu
sudo apt install libczmq-dev

# macOS
brew install czmq

Then add the gem:

gem install cztop
# or in Gemfile
gem 'cztop'

Learning ZeroMQ

New to ZeroMQ? See ZGUIDE_SUMMARY.md — a ~30 min read covering all major patterns with working CZTop code examples.

Quick Start

Request / Reply

require 'cztop'
require 'async'

Async do |task|
  rep = CZTop::Socket::REP.new('inproc://example')
  req = CZTop::Socket::REQ.new('inproc://example')

  task.async do
    msg = rep.receive
    rep << msg.map(&:upcase)
  end

  req << 'hello'
  puts req.receive.inspect  # => ["HELLO"]
end

Pub / Sub

Async do |task|
  pub = CZTop::Socket::PUB.new('inproc://pubsub')
  sub = CZTop::Socket::SUB.new('inproc://pubsub')
  sub.subscribe('')  # subscribe to all

  sleep 0.01  # allow connection to establish

  task.async { pub << 'news flash' }
  puts sub.receive.inspect  # => ["news flash"]
end

Push / Pull (Pipeline)

Async do
  push = CZTop::Socket::PUSH.new('inproc://pipeline')
  pull = CZTop::Socket::PULL.new('inproc://pipeline')

  push << 'work item'
  puts pull.receive.inspect  # => ["work item"]
end

Socket Types

PatternClassesDirection
Request/ReplyREQ, REPbidirectional
Publish/SubscribePUB, SUB, XPUB, XSUBunidirectional
PipelinePUSH, PULLunidirectional
RoutingDEALER, ROUTERbidirectional
Exclusive pairPAIRbidirectional
Raw TCPSTREAMbidirectional

All classes live under CZTop::Socket::.

Performance

Benchmarked with benchmark-ips on Linux x86_64 (CZMQ 4.2.1, ZMQ 4.3.5, Ruby 4.0.1 +YJIT):

Throughput (push/pull)

inprocipctcp
Async284k/s17k/s14k/s
Threads353k/s25k/s21k/s

Latency (req/rep roundtrip)

inprocipctcp
Async49 µs100 µs107 µs
Threads113 µs154 µs168 µs

Async fibers deliver 2.3x lower inproc latency thanks to cheap context switching. See bench/ for full results and scripts.

API Reference

Full API documentation.

Development

bundle install
bundle exec rake

License

ISC