This depends on how you manage the reboot and sending of messages. For instance, using TCP, after a reboot you will need to reconnect do to the nature of the stream connection. If the server is OK with this and can take connection requests from clients then simply have the following setup:
Server:
Maintains a message queue to send to clients
Listens for incoming connection requests from clients
For each client connected, attach it to the message queue
For each message, send to all attached clients
Client:
On reboot, connect to server
Receive message:
If active: process according to message, reply to server
If not active: discard message The drawback to this approach is the additional bandwidth consumption on the link. If all messages are going to all clients over a constrained shared link then as you scale you will eventually flood the link. To mitigate that scenario you could add the additional logic to the server:
Server:
listen for client connections (with MAX)
client connects:
if maximum client count reached: deny connection
else: accept as above
This means that there is always at least one additional client receiving messages (and ready to become active) but no more than MAX. Passive clients (previously denied a connection) can periodically try to connect to the server to always ensure that there is a constant pool of available clients (in the face of shutdowns)