Yeah, my first thought was to make it a task and make that async … but I agree it's not the nicest to have that in your process definition.
You could look into creating a custom job type (like we now have for the async jobs and the timer jobs) that executes your custom logic when it's picked up.
I think you'll have to choose between rolling back or storing the information somewhere intermediary (but not being pub/sub anymore)