mirror of
https://github.com/zeromq/libzmq.git
synced 2025-01-17 12:58:12 +08:00
b6cdd369e3
* Fixed zmq_term, zmq_socket, zmq_close, zmq_setsockopt, * zmq_getsockopt, zmq_bind, zmq_connect, zmq_send, * zmq_recv, zmq_poll, zmq_device, zmq_stopwatch_stop * Updated Reference Manual for these methods
144 lines
4.4 KiB
Plaintext
144 lines
4.4 KiB
Plaintext
zmq_device(3)
|
|
=============
|
|
|
|
NAME
|
|
----
|
|
zmq_device - start built-in 0MQ device
|
|
|
|
|
|
SYNOPSIS
|
|
--------
|
|
*int zmq_device (int 'device', const void '*frontend', const void '*backend');*
|
|
|
|
|
|
DESCRIPTION
|
|
-----------
|
|
The _zmq_device()_ function starts a built-in 0MQ device. The 'device'
|
|
argument is one of:
|
|
|
|
'ZMQ_QUEUE'::
|
|
starts a queue device
|
|
'ZMQ_FORWARDER'::
|
|
starts a forwarder device
|
|
'ZMQ_STREAMER'::
|
|
starts a streamer device
|
|
|
|
The device connects a frontend socket to a backend socket. Conceptually, data
|
|
flows from frontend to backend. Depending on the socket types, replies may
|
|
flow in the opposite direction.
|
|
|
|
Before calling _zmq_device()_ you must set any socket options, and connect or
|
|
bind both frontend and backend sockets. The two conventional device models
|
|
are:
|
|
|
|
* proxy model - accept inward connections to frontend socket (by binding it to
|
|
an endpoint), and make onward connections through backend socket (connecting
|
|
to endpoints on other nodes). A proxy device model can fit well into an
|
|
existing topology.
|
|
* broker model - accept connections on both frontend and backend sockets (by
|
|
binding both to endpoints). A broker device model creates a star topology
|
|
where nodes can come and go at any time.
|
|
|
|
_zmq_device()_ runs in the current thread and returns only if/when the current
|
|
context is closed.
|
|
|
|
|
|
QUEUE DEVICE
|
|
------------
|
|
'ZMQ_QUEUE' creates a shared queue that collects requests from a set of
|
|
clients, and distributes these fairly among a set of services. Requests are
|
|
fair-queued from frontend connections and load-balanced between backend
|
|
connections. Replies automatically return to the client that made the original
|
|
request.
|
|
|
|
This device is part of the 'request-reply' pattern. The frontend speaks to
|
|
clients and the backend speaks to services. You should use 'ZMQ_QUEUE' with a
|
|
'ZMQ_XREP' socket for the frontend and a 'ZMQ_XREQ' socket for the backend.
|
|
Other combinations are not documented.
|
|
|
|
Refer to linkzmq:zmq_socket[3] for a description of these socket types.
|
|
|
|
|
|
FORWARDER DEVICE
|
|
----------------
|
|
'ZMQ_FORWARDER' collects messages from a set of publishers and forwards these
|
|
to a set of subscribers. You will generally use this to bridge networks, e.g.
|
|
read on TCP unicast and forward on multicast.
|
|
|
|
This device is part of the 'publish-subscribe' pattern. The frontend speaks to
|
|
publishers and the backend speaks to subscribers. You should use
|
|
'ZMQ_FORWARDER' with a 'ZMQ_SUB' socket for the frontend and a 'ZMQ_PUB' socket
|
|
for the backend. Other combinations are not documented.
|
|
|
|
Refer to linkzmq:zmq_socket[3] for a description of these socket types.
|
|
|
|
|
|
STREAMER DEVICE
|
|
---------------
|
|
'ZMQ_STREAMER' collects tasks from a set of pushers and forwards these to a set
|
|
of pullers. You will generally use this to bridge networks. Messages are
|
|
fair-queued from pushers and load-balanced to pullers.
|
|
|
|
This device is part of the 'pipeline' pattern. The frontend speaks to pushers
|
|
and the backend speaks to pullers. You should use 'ZMQ_STREAMER' with a
|
|
'ZMQ_PULL' socket for the frontend and a 'ZMQ_PUSH' socket for the backend.
|
|
Other combinations are not documented.
|
|
|
|
Refer to linkzmq:zmq_socket[3] for a description of these socket types.
|
|
|
|
|
|
RETURN VALUE
|
|
------------
|
|
The _zmq_device()_ function shall not return if successful. Otherwise it shall
|
|
return `-1` and set 'errno' to one of the values defined below.
|
|
|
|
|
|
ERRORS
|
|
------
|
|
*ETERM*::
|
|
The 0MQ 'context' associated with the specified 'frontend' or 'backend' was
|
|
terminated.
|
|
*EFAULT*::
|
|
The provided 'frontend' or 'backend' was not valid (NULL).
|
|
|
|
|
|
EXAMPLE
|
|
-------
|
|
.Creating a queue broker
|
|
----
|
|
// Create frontend and backend sockets
|
|
void *frontend = zmq_socket (context, ZMQ_XREP);
|
|
assert (backend);
|
|
void *backend = zmq_socket (context, ZMQ_XREQ);
|
|
assert (frontend);
|
|
// Bind both sockets to TCP ports
|
|
assert (zmq_bind (frontend, "tcp://*:5555") == 0);
|
|
assert (zmq_bind (backend, "tcp://*:5556") == 0);
|
|
// Start a queue device
|
|
zmq_device (ZMQ_QUEUE, frontend, backend);
|
|
----
|
|
|
|
.Creating a pubsub proxy
|
|
----
|
|
// Create frontend and backend sockets
|
|
void *frontend = zmq_socket (context, ZMQ_SUB);
|
|
assert (backend);
|
|
void *backend = zmq_socket (context, ZMQ_PUB);
|
|
assert (frontend);
|
|
// Connect frontend to publisher
|
|
assert (zmq_bind (frontend, "tcp://192.68.55.112:4444") == 0);
|
|
// Bind backend to TCP port
|
|
assert (zmq_bind (backend, "tcp://*:5556") == 0);
|
|
// Start a forwarder device
|
|
zmq_device (ZMQ_FORWARDER, frontend, backend);
|
|
----
|
|
|
|
|
|
SEE ALSO
|
|
--------
|
|
linkzmq:zmq_bind[3]
|
|
linkzmq:zmq_connect[3]
|
|
linkzmq:zmq_socket[3]
|
|
linkzmq:zmq[7]
|
|
|