SELECT ... FOR UPDATE SKIP LOCKED is purpose-built for this and is what most Postgres-backed queues use:
SKIP LOCKED is the important part — without it, workers queue behind each other on the same row and throughput collapses to serial. With it, each worker takes the first row nobody else holds.
Advisory locks are for coordinating things that are not rows (a nightly job that must run once across the fleet). For claiming rows, they are strictly more bookkeeping.