We've been doing some work in that area with a customer. It's possible with the 4.2.1 ESB, but it'll be a lot easier in the next community and platform releases.
If you have to roll your own, then you could use the event manager, for instance (if you don't want to tie yourself to JMS, say). Stripe the data in whatever way makes sense for you and then publish a notification on to the event bus. Depending on how you want to implement this, the event listeners could compete for the work. If they do the message receipt and work in the scope of the same transaction, then a failure will obviously place the work back in the pool for some other listener to pull.
And concerning my second question (split on several machines) ?
If the workers are connected using JMS then they can be on different machines.