Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

NATS, What a Beautiful Protocol

DZone's Guide to

NATS, What a Beautiful Protocol

Brian Flannery follows along with Daniel Wertheim's blog post about the NATS protocol.

· IoT Zone
Free Resource

One of the nice things about NATS.io (an open source messaging system for microservices, IoT, and Cloud Native messaging) is the simplicity of the protocol. As a developer, you can very quickly get NATS running and understand it; this is in contrast to traditional messaging systems, which can introduce complexity and operational complexity. This focus on simplicity makes it very well suited for modern distributed systems.

Daniel Wertheim is a community developer who has written several excellent posts on his blog about NATS. 

Here is the 1st in his series of posts.

--

Just had a quick glance at NATS and its protocol and I said: "OMG, it's like so simple and therefore so tremendously beautiful. Why? I told you. It's simple. And I can read it. As in read it and understand it without having to read a boring specification about a binary fixed protocol format."

New relevant post: "Simple incoming OP parser for Nats in C#"

Without any deep thoughts (so you can most certainly laugh at my hacky bits), using C#, I just put down something simple that publishes messages to a subscriber in Telnet:

Func<string, byte[]> encode = Encoding.UTF8.GetBytes;  
Func<byte[], string> decode = Encoding.UTF8.GetString;

Func<Socket, byte[]> read = socket =>  
{
    var buff = new byte[256];
    var r = socket.Receive(buff);

    return buff.Take(r).ToArray();
};

Action<Socket> dump = s =>  
{
    var buff = read(s);
    Console.WriteLine(buff.Any()
        ? decode(buff)
        : "--nothing--");
};

Action<Socket, string> pub = (s, m) =>  
    s.Send(encode($"pub foo {m.Length}\r\n{m}\r\n"));

using (var tcp = new TcpClient())  
{
    tcp.Connect("demo.nats.io", 4222);

    dump(tcp.Client);

    while (true)
    {
        var msg = Console.ReadLine();
        if (string.IsNullOrWhiteSpace(msg))
            break;

        pub(tcp.Client, msg);

        dump(tcp.Client);
    }

    tcp.Close();
}


So now, if you start a telnet session and go:

telnet demo.nats.io 4222  
sub foo subId123  


Then take the C# code and run it in e.g. a console application, then you would be able to do this:


Simple, right? Which seems to be the characteristics of NATS. It's trying to be simple in the way that it doesn't try to support every use case found in an enterprise scenario. But, hey, I just started looking into it.

Cheers,

//Daniel

Topics:
golang ,microservices ,messaging middleware ,messaging protocol ,messaging queue ,c# ,nats

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}