base on nanomsg-next-generation -- light-weight brokerless messaging # nng - nanomsg-next-gen
[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua)
[![Linux Status](https://img.shields.io/github/actions/workflow/status/nanomsg/nng/linux.yml?branch=main&logoColor=grey&logo=ubuntu&label=)](https://github.com/nanomsg/nng/actions)
[![Windows Status](https://img.shields.io/github/actions/workflow/status/nanomsg/nng/windows.yml?branch=main&logoColor=grey&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0ODc1IDQ4NzUiPjxwYXRoIGZpbGw9ImdyZXkiIGQ9Ik0wIDBoMjMxMXYyMzEwSDB6bTI1NjQgMGgyMzExdjIzMTBIMjU2NHpNMCAyNTY0aDIzMTF2MjMxMUgwem0yNTY0IDBoMjMxMXYyMzExSDI1NjQiLz48L3N2Zz4=&label=)](https://github.com/nanomsg/nng/actions)
[![macOS Status](https://img.shields.io/github/actions/workflow/status/nanomsg/nng/darwin.yml?branch=main&logoColor=grey&logo=apple&label=)](https://github.com/nanomsg/nng/actions)
[![Coverage](https://img.shields.io/codecov/c/github/nanomsg/nng/branch/main?logo=codecov&logoColor=grey&label=)](https://codecov.io/gh/nanomsg/nng/tree/main)
[![Discord](https://img.shields.io/discord/639573728212156478?label=&logo=discord)](https://discord.gg/Xnac6b9)
[![Manual](https://img.shields.io/static/v1?label=&message=docs&logo=asciidoctor&logoColor=silver&color=blue)](https://nng.nanomsg.org/man)
[![MIT License](https://img.shields.io/github/license/nanomsg/nng.svg?logoColor=silver&logo=open-source-initiative&label=&color=blue)](https://github.com/nanomsg/nng/blob/main/LICENSE.txt)
[![Latest Version](https://img.shields.io/github/v/tag/nanomsg/nng.svg?logo=github&label=)](https://github.com/nanomsg/nng/releases)
Please see [here](UKRAINE.md) 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`](https://github.com/nanomsg/nng/tree/stable) branch
> for the latest stable release.
>
> As a major release, there are some breaking API changes,
> but a [migration guide](docs/ref/migrate/nng1.md) 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](https://github.com/nanomsg/nanomsg) repository.
This project is a rewrite of the Scalability Protocols
library known as [nanomsg](https://github.com/nanomsg/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](http://nanomsg.org) (and to some extent
[ZeroMQ](http://zeromq.org/)), 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 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](https://github.com/nanomsg/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.
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.
## Requirements
To build this project, you will need a C99 compatible compiler and
[CMake](http://www.cmake.org) version 3.15 or newer.
We recommend using the [Ninja](https://ninja-build.org) 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](https://tls.mbed.org).
See the [build instructions](docs/BUILD_TLS.md) for details.
## Quick Start
With a Linux or UNIX environment:
```sh
$ 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](https://nng.nanomsg.org/man).
> [!NOTE]
> However, an effort to convert the documentation to Markdown using `mdbook`
> is underway. You can see a preview it [here](https://nng.nanomsg.org/ref).
The [_nng_(7)](docs/man/nng.7.adoc) page provides a conceptual overview and links to
manuals for various patterns.
The [_libnng_(3)](docs/man/libnng.3.adoc) page is a good starting point for the API reference.
You can also purchase a copy of the
[**NNG Reference Manual**](http://staysail.tech/books/nng_reference/index.html).
(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](docs/ref/migrate/nanomsg.md) is available to assist.
## Commercial Support
Commercial support for NNG is available.
Please contact
[Staysail Systems, Inc.](mailto:
[email protected])
to inquire further.
## Commercial Sponsors
The development of NNG has been made possible through the generous
sponsorship of
[Capitar IT Group BV](https://www.capitar.com)
and
[Staysail Systems, Inc.](http://staysail.tech).
", Assign "at most 3 tags" to the expected json: {"id":"1992","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"