ROUTER Broker and REQ Workers
Example 3-2 is an example of the load-balancing pattern using a ROUTER broker talking to a set of REQ workers.
Example 3-2. ROUTER-to-REQ (rtreq.c)
//
// ROUTER-to-REQ example
//
#include "zhelpers.h"
#include <pthread.h>
#define NBR_WORKERS 10
static
void
*
worker_task
(
void
*
args
)
{
void
*
context
=
zmq_ctx_new
();
void
*
worker
=
zmq_socket
(
context
,
ZMQ_REQ
);
s_set_id
(
worker
);
// Set a printable identity
zmq_connect
(
worker
,
"tcp://localhost:5671"
);
int
total
=
0
;
while
(
1
)
{
// Tell the broker we're ready for work
s_send
(
worker
,
"Hi Boss"
);
// Get workload from broker, until finished
char
*
workload
=
s_recv
(
worker
);
int
finished
=
(
strcmp
(
workload
,
"Fired!"
)
==
0
);
free
(
workload
);
if
(
finished
)
{
printf
(
"Completed: %d tasks
\n
"
,
total
);
break
;
}
total
++
;
// Do some random work
s_sleep
(
randof
(
500
)
+
1
);
}
zmq_close
(
worker
);
zmq_ctx_destroy
(
context
);
return
NULL
;
}
While this example runs in a single process, that is only to make it easier to start and stop. Each thread has its own context and conceptually acts as a separate process. Example 3-3 shows the main task.
Example 3-3. ROUTER-to-REQ (rtreq.c): main task
int
main
(
void
)
{
void
*
context
=
zmq_ctx_new
();
void
*
broker
=
zmq_socket
(
context
,
ZMQ_ROUTER
);
zmq_bind
(
broker
,
"tcp://*:5671"
);
srandom
((
unsigned
)
time
(
NULL
));
int
worker_nbr
;
for
(
worker_nbr
=
0
;
worker_nbr
<
NBR_WORKERS
;
worker_nbr
++
)
{
pthread_t
worker
;
pthread_create
(
&
worker
,
NULL
,
worker_task
,
NULL
);
}
// Run for five ...
Get ZeroMQ now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.