Features
Queue
Background job system with memory and persistent file modes in Ply.
Configure Queue
Ply includes a built-in background job system for running asynchronous tasks with support for in-memory and persistent file storage.
Initialization
Initialize the queue system in your main.go:
app := ply.New().WithQueue()
controller.Quehandler(app.EngineCtx)You can also chain this with other modules:
app := ply.New().WithCache().WithPubsub().WithQueue()
How It Works
- Jobs are pushed with
Enqueue(topic, data)and processed later. - Each queue is identified by a topic string.
- Workers process jobs from either memory, storage, or both.
Example usage
Enqueue to memory (fast, volatile)
if err := c.MustQueue().Memory.Enqueue("user:welcome-email", payload); err != nil {
c.JSON(500, map[string]string{"error": "Queue error"})
return
}Enqueue to storage (durable, file-based)
if err := c.MustQueue().Storage.Enqueue("user:welcome-email", payload); err != nil {
c.JSON(500, map[string]string{"error": "Queue error"})
return
}Default behavior
When using:
c.MustQueue().EnqueueAll("user:welcome-email", payload)Ply will enqueue the job to both memory and storage (combined mode).
Registering workers
Ply allows flexible worker registration depending on delivery mode:
// Memory worker only
c.Queue.Memory.RegisterWorker("user:welcome-email", SendWelcomeEmailWorker)
// Storage worker only
c.Queue.Storage.RegisterWorker("user:welcome-email", SendWelcomeEmailWorker)
// Both memory + storage (default)
c.Queue.RegisterWorkerAll("user:welcome-email", SendWelcomeEmailWorker)Worker example:
func SendWelcomeEmailWorker(data []byte) error {
var input CreateUserInput
if err := json.Unmarshal(data, &input); err != nil {
return fmt.Errorf("invalid payload: %w", err)
}
fmt.Printf("Queue worker: %s <%s>\n", input.Name, input.Email)
return nil
}
func Quehandler(ctx *core.EngineContext) {
if ctx.Queue == nil {
panic("Queue engine not initialized")
}
ctx.Queue.RegisterWorkerAll("user:welcome-email", SendWelcomeEmailWorker)
}Configuration modes
Ply Queue supports three modes:
- Memory Only: Temporary, best for speed in dev/test.
- File Storage Only: Ensures durability across restarts.
- Combined (default): uses both for speed and durability.
Behind the scenes
Ply Queue uses a dual-layer system:
- Memory: Fast, buffered in-RAM processing
- Storage: Durable JSON logs for crash recovery
Jobs can be enqueued to either or both layers. Automatic cleanup runs every 10 minutes, removing jobs older than 24 hours.
Auto cleanup
Ply automatically cleans up old queue files:
- Interval: every
10 * time.Minute - Retention: deletes jobs older than
24 * time.Hour
No manual intervention needed.
Use Cases
- Email delivery (welcome, verification)
- Background processing (thumbnails, reports)
- Asynchronous workflows

Ply