Pub/Sub consumers should assume connections will drop: Redis restarts, network blips, or idle timeouts happen. I keep the subscription loop simple: subscribe, range over the channel, and exit cleanly when ctx.Done() fires. If the subscription ends unexpectedly, the caller can restart the loop with backoff. The key is not leaking goroutines: always Close() the subscription and stop processing when the context is canceled. In production, I also add a “dead letter” path for messages that fail processing and I expose metrics for message lag (or at least throughput). Pub/Sub is not a durable queue, so I only use it for ephemeral notifications and cache invalidation, not for “must not lose” jobs. But when used appropriately, it’s a lightweight and very effective tool.