Permalink
Fetching contributors…
Cannot retrieve contributors at this time
99 lines (72 sloc) 2.92 KB
---
title: Messaging (NATS)
description: Lightweight publish-subscribe and distributed queueing messaging system.
owner: Infrastructure
---
<strong><%= modified_date %></strong>
This information was adapted from the [NATS](https://github.com/nats-io/ruby-nats) README. NATS is a lightweight publish-subscribe and distributed queueing messaging system written in Ruby.
<%= vars.nats_tls %>
## <a id='install'></a>Install NATS ##
<pre class="terminal">
$ gem install nats
# or
$ rake geminstall
$ nats-sub foo &
$ nats-pub foo 'Hello World!'
</pre>
## <a id='basic-usage'></a>Basic Usage ##
~~~ruby
require "nats/client"
NATS.start do
# Simple Subscriber
NATS.subscribe('foo') { |msg| puts "Msg received : '#{msg}'" }
# Simple Publisher
NATS.publish('foo.bar.baz', 'Hello World!')
# Unsubscribing
sid = NATS.subscribe('bar') { |msg| puts "Msg received : '#{msg}'" }
NATS.unsubscribe(sid)
# Requests
NATS.request('help') { |response| puts "Got a response: '#{response}'" }
# Replies
NATS.subscribe('help') { |msg, reply| NATS.publish(reply, "I'll help!") }
# Stop using NATS.stop, exits EM loop if NATS.start started the loop
NATS.stop
end
~~~
## <a id='wildcard'></a>Wildcard Subscriptions ##
~~~ruby
# "*" matches any token, at any level of the subject.
NATS.subscribe('foo.*.baz') { |msg, reply, sub| puts "Msg received on [#{sub}] : '#{msg}'" }
NATS.subscribe('foo.bar.*') { |msg, reply, sub| puts "Msg received on [#{sub}] : '#{msg}'" }
NATS.subscribe('*.bar.*') { |msg, reply, sub| puts "Msg received on [#{sub}] : '#{msg}'" }
# ">" matches any length of the tail of a subject and can only be the last token
# E.g. 'foo.>' will match 'foo.bar', 'foo.bar.baz', 'foo.foo.bar.bax.22'
NATS.subscribe('foo.>') { |msg, reply, sub| puts "Msg received on [#{sub}] : '#{msg}'" }
~~~
## <a id='queues-groups'></a>Queues Groups ##
~~~ruby
# All subscriptions with the same queue name will form a queue group
# Each message will be delivered to only one subscriber per queue group, queuing semantics
# You can have as many queue groups as you want
# Normal subscribers will continue to work as expected.
NATS.subscribe(subject, :queue => 'job.workers') { |msg| puts "Received '#{msg}'" }
~~~
## <a id='advanced-usage'></a>Advanced Usage ##
~~~ruby
# Publish with closure, callback fires when server has processed the message
NATS.publish('foo', 'You done?') { puts 'msg processed!' }
# Timeouts for subscriptions
sid = NATS.subscribe('foo') { received += 1 }
NATS.timeout(sid, TIMEOUT_IN_SECS) { timeout_recvd = true }
# Timeout unless a certain number of messages have been received
NATS.timeout(sid, TIMEOUT_IN_SECS, :expected => 2) { timeout_recvd = true }
# Auto-unsubscribe after MAX_WANTED messages received
NATS.unsubscribe(sid, MAX_WANTED)
# Multiple connections
NATS.subscribe('test') do |msg|
puts "received msg"
NATS.stop
end
# Form second connection to send message on
NATS.connect { NATS.publish('test', 'Hello World!') }
~~~