NNG Pub/Sub Bridging
NanoMQ supports data bridging with NNG (Next Generation Scalability Protocols) pub0/sub0 protocols, leveraging its underlying NanoNNG engine. This is particularly useful in edge computing scenarios where you need to interface standard MQTT with high-throughput NNG-based internal message buses.
NNG bridging is divided into two directions: NNG Pub Bridge (forwarding MQTT messages to NNG) and NNG Sub Bridge (receiving NNG messages and publishing them as MQTT).
NNG Pub Bridge (bridges.nng.pub)
The NNG Pub Bridge is responsible for forwarding MQTT messages from local topics to a remote NNG pub0 socket.
- Data Flow: MQTT PUBLISH → NNG
pub0message. - Workflow: MQTT Client publishes to
local_topic→ Bridge subscribes and extracts the payload → Payload is prefixed withremote_topic + nng_delimiter(default/) → Sent to NNG pub socket.
Configuration Example
hcl
bridges.nng.pub.t1 {
# Enable or disable this bridge.
#
# Value: true | false
# Default: false
enable = true
# NNG pub socket URL.
# The address of the NNG pub0 protocol server to publish to.
#
# Value: String
# Example: tcp://127.0.0.1:9900
# ipc:///tmp/nng_pub.ipc
# inproc://nng_pub_inproc (Use for Inter-process communication)
pub_url = "tcp://localhost:9900"
# The ClientId of this NNG bridge publisher.
# Default random string.
#
# Value: String
clientid = "nng_proxy"
# Topics that need to be forwarded to NNG.
# This defines mappings between local MQTT topics and remote NNG topics.
#
# Value: Array of objects
forwards = [
{
# Local MQTT topic filter to subscribe to.
# Messages matching this filter are forwarded.
# Supports MQTT wildcards (# and +).
#
# Value: String
local_topic = "nng/#"
# Remote NNG topic to publish to.
# NNG message format:
# "remote_topic + nng_delimiter + payload"
# If remote_topic is empty, it is treated as local_topic.
#
# Value: String
remote_topic = "remote/nng"
# Delimiter between remote_topic and payload in NNG message.
# Default delimiter is "/".
# Example with ":" -> "remote_topic:payload".
#
# Value: String
nng_delimiter = ":"
# QoS level for MQTT messages from local_topic.
# Value: 0 | 1 | 2
qos = 1
},
{
local_topic = "ekuiper/"
# Example of fallback behavior:
# when remote_topic is empty, remote_topic = local_topic.
remote_topic = ""
nng_delimiter = "/"
}
]
}Parameters
bridges.nng.pub.<name>: Defines an NNG Pub bridge instance, where<name>is a unique identifier (e.g.,t1).enable: Whether to enable this bridge. Value:true|false. Default:false.pub_url: The address on which NanoMQ listens with its NNGpub0socket. External NNG sub clients connect to this address to receive messages. Supports various transports such astcp://127.0.0.1:9900,ipc:///tmp/nng_pub.ipcorinproc://inproc_thr.clientid: Identifier for this bridge publisher within the local NanoMQ broker.forwards: Array of mapping rules between local MQTT topics and remote NNG topics.local_topic: The local MQTT topic filter to subscribe to. Supports wildcards (#and+).remote_topic: The topic prefix prepended to the payload when sending to the NNG side. The constructed NNG message format is:"remote_topic + nng_delimiter + payload". Ifremote_topicis omitted or set to an empty string, it is treated aslocal_topic.nng_delimiter: Delimiter inserted betweenremote_topicand payload when building NNG messages. Default:/. Example::producesremote_topic:payload.qos: QoS level used for the internal subscription tolocal_topic. Value:0|1|2.
NNG Sub Bridge (bridges.nng.sub)
The NNG Sub Bridge subscribes to topics on a remote NNG sub0 socket and forwards received messages as MQTT publications to a local topic.
- Data Flow: NNG
sub0message → MQTT PUBLISH. - Workflow: NNG pub socket sends message with prefix → Bridge matches
remote_topic + nng_delimiter(default/) → Forwards remainder of message as MQTT payload tolocal_topic.
Configuration Example
hcl
bridges.nng.sub.t2 {
# Enable or disable this bridge.
#
# Value: true | false
# Default: false
enable = true
# NNG sub socket URL.
# The address of the NNG sub0 protocol server to subscribe to.
#
# Value: String
# Example: tcp://127.0.0.1:9901
# ipc:///tmp/nng_sub.ipc
# inproc://nng_sub_inproc (Use for Inter-process communication)
sub_url = "tcp://localhost:9901"
# The ClientId of this NNG bridge subscriber.
# Default random string.
#
# Value: String
clientid = "nng_proxy_2"
# Subscription topics from remote NNG server.
# This defines mappings between remote NNG topics and local MQTT topics.
#
# Value: Array of objects
subscription = [
{
# Remote NNG topic to subscribe to.
# Topic extraction rules:
# 1) If nng_delimiter is not set or is "/":
# extracted topic is matched against configured remote_topic,
# and the matched suffix (the part after matched prefix)
# becomes payload.
# Example: remote_topic="nng/pub", nng_delimiter="/",
# msg="nng/pub/123/hello" -> extracted topic="nng/pub",
# payload="123/hello".
# 2) If nng_delimiter is set to non-"/" (e.g. ":"):
# extracted topic extends from remote_topic prefix to delimiter,
# and the part after delimiter becomes payload.
# Example: remote_topic="nng/pub", nng_delimiter=":",
# msg="nng/pub/123/1234:payload" ->
# extracted topic="nng/pub/123/1234", payload="payload".
#
# Value: String
remote_topic = "nng"
# Delimiter between remote_topic and payload in incoming NNG message.
# Default delimiter is "/".
#
# Value: String
nng_delimiter = "/"
# Local MQTT topic to publish to.
# If local_topic is empty, local_topic is treated as remote_topic.
#
# Value: String
local_topic = "local/nng"
# QoS level for MQTT messages published to local_topic.
# Value: 0 | 1 | 2
qos = 1
},
{
remote_topic = "ekuiper"
nng_delimiter = ":"
local_topic = "local/ekuiper"
}
]
}Parameters
bridges.nng.sub.<name>: Defines an NNG Sub bridge instance, where<name>is a unique identifier (e.g.,t2).enable: Whether to enable this bridge. Value:true|false. Default:false.sub_url: The address on which NanoMQ listens with its NNGsub0socket. External NNG pub clients connect to this address to push messages. Supports TCP and IPC transports, e.g.,tcp://localhost:9901,ipc:///tmp/nng_sub.ipcorinproc://inproc_thr.clientid: Identifier for this bridge subscriber within the local NanoMQ broker.subscription: Array of mapping rules between remote NNG topics and local MQTT topics.remote_topic: The NNG topic prefix to subscribe to. Topic extraction rules:- If
nng_delimiteris not set or is/: extracted topic is matched against configuredremote_topic, and the matched suffix (the part after matched prefix) becomes payload. Example:remote_topic="nng/pub",nng_delimiter="/", message"nng/pub/123/hello"→ extracted topic="nng/pub", payload="123/hello". - If
nng_delimiteris set to non-/(e.g.":"): extracted topic extends fromremote_topicprefix to delimiter, and the part after delimiter becomes payload. Example:remote_topic="nng/pub",nng_delimiter=":", message"nng/pub/123/1234:payload"→ extracted topic="nng/pub/123/1234", payload="payload".
- If
nng_delimiter: Delimiter used when matchingremote_topicand splitting payload from incoming NNG messages. Default:/.local_topic: The local MQTT topic to which the forwarded message will be published. Iflocal_topicis omitted or set to an empty string, it is treated asremote_topic.qos: QoS level used when publishing the message to the local broker. Value:0|1|2.