Just had a quick glance at NATS and its protocol and I went: 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.
All posts in this series
- NATS, What a beautiful protocol
- Simple incoming OP parser for NATS in C#
- Using the OpParser with NATS to create a long running consumer in C#
- Continuing with C# and NATS, now looking at NatsObservable
- Time to construct a bundled NATS client for 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