We accomplish this by having a pool of “worker” headless clients that poll a table looking for work to do.
Any client that needs a headless client to run some work writes a job to this table (methodname, arguments, priority, etc).
This alleviates the clients from having to worry about which HLC to send their work to, but you do lose the ability to naturally get the return value from whatever you are running.