I'm not sure of anyone covering all the approaches in depth but by far the best solution is to use advisory locks. Take a look at Que, there are implementations in Ruby/Go that I'm aware of but you could easily port it to anything else as it's just a bunch of pretty simple PostgreSQL + some session features.