Skip to content

nanomsg/nng

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nng - nanomsg-next-gen

Stand With Ukraine Linux Status Windows Status macOS Status FreeBSD Status illumos Status Coverage Discord Manual MIT License Latest Pre-Release Latest Release

Please see here for an important message for the people of Russia.

Note

This is the development branch for NNG. The content here is under development and may not be suitable for production use. Please use the stable branch for the latest stable release.

As a major release, there are some breaking API changes, but a migration guide is available to help with migrating from NNG 1.x.

Note

If you are looking for the legacy version of nanomsg, please see the libnanomsg repository.

This project is a rewrite of the Scalability Protocols library known as nanomsg, and adds significant new capabilities, while retaining compatibility with the original.

It may help to think of this as "nanomsg-next-generation".

NNG: Lightweight Messaging Library

NNG, like its predecessors nanomsg (and to some extent ZeroMQ), is a 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.

NNG is implemented in C, requiring only a relatively modern C compiler (C11) and CMake to build. It can be built as a shared or a static library, and is readily embeddable. It is also designed to be easy to port to new platforms if your platform is not already supported.

License

NNG is licensed under a liberal, and commercial friendly, MIT license. The goal to the license is to minimize friction in adoption, use, and contribution.

Enhancements (Relative to nanomsg)

Here are areas where this project improves on "nanomsg":

  • 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 optionally 1.3) 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.

That said, there are some areas where legacy nanomsg still offers capabilities NNG lacks -- specifically enhanced observability with statistics, and tunable prioritization of different destinations are missing, but will be added in a future release.

Additionally, some API capabilities that are useful for foreign language bindings are not implemented yet.

Some simple single threaded, synchronous applications may perform better under legacy nanomsg than under NNG. (We believe that these applications are the least commonly deployed, and least interesting from a performance perspective. NNG's internal design is slightly less efficient in such scenarios, but it greatly benefits when concurrency or when multiple sockets or network peers are involved.)

Supported Platforms

NNG supports Linux, macOS, Windows, illumos, Solaris, FreeBSD, Android, and iOS. It is regularly tested against macOS, Windows, OmniOS, Ubuntu, and FreeBSD. 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.

Officially, NNG only supports operating systems that are supported by their vendors. For example, Windows versions 8.1 and lower are no longer officially supported, and macOS versions predating Ventura are no longer officially supported. Very old versions of systems may or may not work, and we will generally expend no effort trying to make an unsupported system function. We generally only test relatively recent versions of supported systems.

Requirements

To build this project, you will need a C11 compatible compiler and CMake version 3.15 or newer.

We recommend using the Ninja build system (pass -G Ninja to CMake) when you 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 Mbed TLS or WolfSSL.
See the build instructions for details.

Quick Start

With a Linux or UNIX environment:

$ mkdir build
$ cd build
$ cmake -G Ninja ..
$ ninja
$ ninja test
$ ninja install

API Documentation

The API documentation is provided in Asciidoc format in the docs/man subdirectory, and also online.

Note

However, an effort to convert the documentation to Markdown using mdbook is underway. You can see a preview it here.

The nng(7) page provides a conceptual overview and links to manuals for various patterns. The libnng(3) page is a good starting point for the API reference.

You can also purchase a copy of the NNG Reference Manual. (It is published in both electronic and printed formats.) Purchases of the book help fund continued development of NNG.

Example Programs

Some demonstration programs have been created to help serve as examples. These are located in the demo directory.

Legacy Compatibility

Migration from libnanomsg APIs is fairly straight-forward for most applications. A migration guide is available to assist.

Commercial Support

Commercial support for NNG is available.

Please contact Staysail Systems, Inc. to inquire further.

Commercial Sponsors

The development of NNG has been made possible through the generous sponsorship of Capitar IT Group BV and Staysail Systems, Inc..