The simplest solution is often the best. The team avoided a lot of pain once they stopped doing things 'the Rails way' with callbacks and gem-slapping and instead wrote a single processing worker that did everything from top to bottom: check/create versions, transcode by priority, upload to S3 on a separate queue.