I learned a lot about event-driven distributed systems by just building things with ZeroMQ. Even if you don't end up using it, learning its messaging patterns and the decisions behind them can give you a pretty solid mental framework.
The ZeroMQ guide really takes you through it in detail, for example check out Figure 19 here for a parallel job queue with cancellation: https://zguide.zeromq.org/docs/chapter2/#Handling-Errors-and...