Over a million developers have joined DZone.

NATS, What a Beautiful Protocol

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

· IoT Zone

Access the survey results 'State of Industrial Internet Application Development' to learn about latest challenges, trends and opportunities with Industrial IoT, brought to you in partnership with GE Digital.

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);
        ? 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);


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

        pub(tcp.Client, msg);



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.



The IoT Zone is brought to you in partnership with GE Digital.  Discover how IoT developers are using Predix to disrupt traditional industrial development models.

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

The best of DZone straight to your inbox.

Please provide a valid email address.

Thanks for subscribing!

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

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

{{ parent.tldr }}

{{ parent.urlSource.name }}