I love the idea of core.async channels as generic inboxes for "in-program microservices" for lack of a better term. They're a great decoupling mechanism.
But I get a little confused when you get beyond a producer-consumer model. A service with an inbox (consumer) works well for multiple clients (producers) because they can all just dump data into the same inbox. But it gets a little trickier if you want any data back (toy example: a jukebox microservice with an input channel: drop the song name in as a string and it starts playing, and doesn't care if A, B, or C dropped the song name in, but if A wants a list of available songs you need a return channel and the jukebox can't just drop A's list of songs in a single outbox.
Either it feels like you need separate return channels for each client (which complects transport with processing, but would let each client pretend they had a private connection) or you have to use core.async publish-subscribe, maybe pulling "sender" out of the topic for the return address and have clients subscribe to the service's output channel based on their own identifier, but that forces messages to carry extra information about routing... which may be fine.
Is there an established pattern or mechanism for this, or is pub/sub probably the best way to go?