The nng_device()
function forwards messages received from one
socket s1 to another socket s2, and vice versa.
This function is used to create forwarders, which can be used to create complex network topologies to provide for improved horizontal scalability, reliability, and isolation.
Only raw mode sockets may be used with this
function.
These can be created using _raw
forms of the various socket constructors,
such as nng_req0_open_raw()
.
The nng_device()
function does not return until one of the sockets
is closed.
One of the sockets passed may be an unopened socket initialized with
the NNG_SOCKET_INITIALIZER
special value.
If this is the case, then the other socket must be valid, and must use
a protocol that is bidirectional and can peer with itself (such as
pair or
bus.)
In this case the device acts as a reflector or loop-back device,
where messages received from the valid socket are merely returned
back to the sender.
When both sockets are valid, then the result is a forwarder or proxy. In this case sockets s1 and s2 must be compatible with each other, which is to say that they should represent the opposite halves of a two protocol pattern, or both be the same protocol for a single protocol pattern. For example, if s1 is a pub socket, then s2 must be a sub socket. Or, if s1 is a bus socket, then s2 must also be a bus socket.
The nng_device()
function moves messages between the provided sockets.
When a protocol has a backtrace style header, routing information is present in the header of received messages, and is copied to the header of the output bound message. The underlying raw mode protocols supply the necessary header adjustments to add or remove routing headers as needed. This allows replies to be returned to requesters, and responses to be routed back to surveyors.
Additionally, some protocols have a maximum time-to-live to protect
against forwarding loops and especially amplification loops.
In these cases, the default limit (usually 8), ensures that messages will
self-terminate when they have passed through too many forwarders,
protecting the network from unlimited message amplification that can arise
through misconfiguration.
This is controlled via the NNG_OPT_MAXTTL
option.
Important
|
Not all protocols have support for guarding against forwarding loops, and even for those that do, forwarding loops can be extremely detrimental to network performance. |
Note
|
Devices (forwarders and reflectors) act in best effort delivery mode only. If a message is received from one socket that cannot be accepted by the other (due to backpressure or other issues), then the message is discarded. |
Tip
|
Use the request/reply pattern, which includes automatic retries by the requester, if reliable delivery is needed. |
This function continues running, and only returns an appropriate error when one occurs, or if one of the sockets is closed.
NNG_ECLOSED
|
At least one of the sockets is not open. |
NNG_ENOMEM
|
Insufficient memory is available. |
NNG_EINVAL
|
The sockets are not compatible, or are both invalid. |