问题
If you're using PUSH sockets, you'll find that the first PULL socket to connect will grab an unfair share of messages. The accurate rotation of messages only happens when all PULL sockets are successfully connected, which can take some milliseconds. As an alternative to PUSH/PULL, for lower data rates, consider using ROUTER/DEALER and the load balancing pattern.
So one way to do sync in PUSH/PULL is using the load balancing pattern.
For this specific case below, I wonder whether there is another way to do sync:
I could set the PULL endpoint in worker to block until the connection successfully setup, and then send a special message via worker's PULL endpoint to 'sink'. After 'sink' receives #worker's special messages, 'sink' sends a message with REQ-REP to 'ventilator' to notify that all workers ready. 'ventilator' starts to distribute jobs to workers. Is it reliable?
The picture is from here
回答1:
Yes, so long as the Sink
knows how many Workers
to wait for before telling the Ventilator
that it's OK to start sending messages. There's the question of whether the special messages from the Workers
get through if they start up before the Sink
connects - but you could solve that by having them keep sending their special message until they start getting data from the Ventilator
. If you do this, the Sink
would of course simply ignore any duplicates it receives.
Of course, that's not quite the same as the Workers
having a live, working connection to the Ventilator
, but that could itself be sending out special do-nothing messages that the Workers
receive. When they receive one of those that's when they can start sending a special message to the Sink
.
来源:https://stackoverflow.com/questions/44096203/another-reliable-way-to-do-pull-push-sync-in-zeromq