Queues are point-to-point: one consumer gets each message. Pub/sub is fan-out: every subscriber gets a copy. Use a queue for tasks (PDF processing, email sending) where exactly one worker should do the work. Use pub/sub for events (audit logs, change data capture) where many systems care.
Queue: SQS / RabbitMQ — each message delivered to one worker.
Pub/sub: Kafka / Redis Streams / SNS — each message broadcast to many subscribers.
You can combine: publish a “pdf.submitted” event so analytics and indexer both react, while a queue handles actual processing.
producer -> [queue] -> ONE consumer (work)
producer -> [topic] -> MANY subscribers (events)
Tasks = queue. Events = pub/sub. They are different shapes of plumbing.