nanomsg-next-generation -- light-weight brokerless messaging.
If you are looking for the legacy version of nanomsg, please see the nanomsg repository. |
This project is a rewrite of the Scalability Protocols library known as libnanomsg, 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 C99 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 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 (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.
Requirements
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 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 mbedTLS. See docs/BUILD_TLS.adoc 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. The libnng(3) page is a good starting point.
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
A legacy libnanomsg compatible API is available, and while it offers less capability than the modern NNG API, it may serve as a transition aid. Please see nng_compat(3) for details.
from https://github.com/nanomsg/nng
----------
mangos is a pure Golang implementation of nanomsg's "Scalablilty Protocols".
mangos
Mangos™ is an implementation in pure Go of the SP (“Scalability Protocols”) messaging system. These are colloquially known as a “nanomsg”. |
The import path has changed! Please change any references from nanomsg.org/go/mangos/v2 to go.nanomsg.org/mangos/v3 . The old v2 imports will still work for old applications, provided that a sufficiently modern version of Go is used. However, no further work will be done on v2. |
Tip | Versions 1 and 2 of mangos were at different import locations. Those versions will still inter-operate with this version, except that within the same process the inproc transport can only be used by consumers using the same version of mangos. |
The modern C implementation of the SP protocols is available as NNG™.
The original implementation of the SP protocols is available as nanomsg™.
Generally (modulo a few caveats) all of these implementations can inter-operate.
The design is intended to make it easy to add new transports with almost trivial effort, as well as new topologies (“protocols” in SP parlance.)
At present, all of the Req/Rep, Pub/Sub, Pair, Bus, Push/Pull, and Surveyor/Respondent patterns are supported. This project also supports an experimental protocol called Star.
Supported transports include TCP, inproc, IPC, WebSocket, WebSocket/TLS and TLS.
Basic interoperability with nanomsg and NNG has been verified (you can do so yourself with nanocat
and macat
) for all protocols and transports that NNG and nanomsg support, except for the ZeroTier transport and the PAIRv1 protocol, which are only supported in NNG at this time.
There are a number of projects that use these products together.
Documentation
For docs, see https://godoc.org/go.nanomsg.org/mangos or run:
$ godoc -http=:6060
Testing
This package supports internal self tests, which can be run in the idiomatic Go way. (Note that most of the tests are in a test subdirectory.)
$ go test go.nanomsg.org/mangos/v3/...
There are also internal benchmarks available:
$ go test -bench=. go.nanomsg.org/mangos/v3/test
Examples
Some examples are posted in the directories under
examples/
in this project.These examples are rewrites (in Go) of Tim Dysinger’s Getting Started with Nanomsg.
Running
go doc
in the example directories will yield information about how to run each example program.Enjoy!
from https://github.com/nanomsg/mangos
No comments:
Post a Comment