Start here. This is the direct spoken answer to practice first.
Why this question matters
Many products need future work: reminders, timeout checks, retries, cleanup, and delayed notifications. Scheduled messages are useful, but they are not the same thing as a full scheduler.
I would use delayed or scheduled messages when work needs to happen after a known delay, such as sending a reminder tomorrow or checking whether a payment is still pending in ten minutes. The message is hidden until its scheduled time, then a worker handles it like normal queued work. The handler still needs idempotency because the user or system state may have changed before the message becomes visible.