to some extent
ZeroMQ
),
lightweight, broker-less library, offering a simple API to solve common
recurring messaging problems, such as publish/subscribe, RPC-style
request/reply, or service discovery. The API frees the programmer from worrying
about details like connection management, retries, and other common
considerations, so that they can focus on the application instead of the
plumbing.
Reliability
NNG is designed for production use from the beginning. Every error case is considered,
and it is designed to avoid crashing except in cases of gross developer error. (Hopefully we don’t have
any of these in our own code.)
Scalability
NNG scales out to engage multiple cores using a bespoke asynchronous I/O framework,
using thread pools to spread load without exceeding typical system limits.
Maintainability
NNG’s architecture is designed to be modular and easily grasped by developers
unfamiliar with the code base. The code is also well documented.
Extensibility
Because it avoids ties to file descriptors, and avoids confusing interlocking state
machines, it is easier to add new protocols and transports to NNG. This was demonstrated by the addition
of the TLS and ZeroTier transports.
Security
NNG provides TLS 1.2 and ZeroTier transports, offering support for robust and industry
standard authentication and encryption. In addition, it is hardened to be resilient against malicious
attackers, with special consideration given to use in a hostile Internet.
Usability
NNG eschews slavish adherence parts of the more complex and less well understood POSIX
APIs, while adopting the semantics that are familiar and useful. New APIs are intuitive, and the optional
support for separating protocol context and state from sockets makes creating concurrent applications
vastly simpler than previously possible.
Compatibility
This project offers both wire compatibility and API compatibility, so most nanomsg
users can begin using
NNG right away.
Existing nanomsg and mangos applications can inter-operate with NNG applications automatically.
Supported Platforms
NNG supports Linux, macOS, Windows (Vista or better), illumos,
Solaris, FreeBSD,
Android, and iOS. Most other POSIX platforms should work out of the box but have not been tested. Very old
versions of otherwise supported platforms might not work.
To build this project, you will need a C99 compatible compiler and
CMake
version 3.13 or
newer.
We recommend using the
Ninja
build system (pass "-G Ninja"
to CMake) when
can. (And not just because
Ninja sounds like "NNG" — it’s also blindingly fast and has made our lives as developers measurably better.)
If you want to build with
TLS
support you will also need
mbedTLS. See
docs/BUILD_TLS.adoc
for details.
With a Linux or UNIX environment:
$ mkdir build
$ cd build
$ cmake -G Ninja ..
$ ninja
$ ninja test
$ ninja install