Binary Star Implementation
Without further ado, here is a proof-of-concept implementation of the Binary Star server, beginning with Example 4-61. The primary and backup servers run the same code, and their roles are chosen by the invoker.
Example 4-61. Binary Star server (bstarsrv.c)
//
// Binary Star server proof-of-concept implementation. This server does no
// real work; it just demonstrates the Binary Star failover model.
#include "czmq.h"
// States in which we can be at any point in time
typedef
enum
{
STATE_PRIMARY
=
1
,
// Primary, waiting for peer to connect
STATE_BACKUP
=
2
,
// Backup, waiting for peer to connect
STATE_ACTIVE
=
3
,
// Active - accepting connections
STATE_PASSIVE
=
4
// Passive - not accepting connections
}
state_t
;
// Events, which start with the states our peer can be in
typedef
enum
{
PEER_PRIMARY
=
1
,
// HA peer is pending primary
PEER_BACKUP
=
2
,
// HA peer is pending backup
PEER_ACTIVE
=
3
,
// HA peer is active
PEER_PASSIVE
=
4
,
// HA peer is passive
CLIENT_REQUEST
=
5
// Client makes request
}
event_t
;
// Our finite-state machine
typedef
struct
{
state_t
state
;
// Current state
event_t
event
;
// Current event
int64_t
peer_expiry
;
// When peer is considered "dead"
}
bstar_t
;
// We send state information this often
// If peer doesn't respond in two heartbeats, it is "dead"
#define HEARTBEAT 1000
// In msec
The heart of the Binary Star design is its finite-state machine (FSM). The FSM runs one event at a time. We apply an event to the current state, which ...
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.