I think you might find it easier to reason about if you think pull rather than push. That is, the client asks the server “do you have a job for me” and the server returns the job. If instead as in your design the server pushes the job to the client it can get real complex (e.g what if the client isn’t ready).
Even with the pull you still need to handle errors (e.g the client fails while processing a job - what does that and how it is handled and communicated).
These systems can get complex very quickly - you are probably better off using an off the shelf solution (search job/workflow orchestration).
But if it just for your edification have a crack at it and have fun.
A good starting point is to look for a multiplxer / multiplexor