From e99e443e274e9ac9da096370e3d5716c87335f5c Mon Sep 17 00:00:00 2001 From: Ken Hibino Date: Sun, 6 Sep 2020 08:03:30 -0700 Subject: [PATCH] Update README --- README.md | 56 +++++++------- docs/assets/cluster.png | Bin 0 -> 61095 bytes tools/asynq/README.md | 158 ++++++---------------------------------- 3 files changed, 48 insertions(+), 166 deletions(-) create mode 100644 docs/assets/cluster.png diff --git a/README.md b/README.md index a17306d..e923b69 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ ## Overview -Asynq is a Go library for queueing tasks and processing them in the background with workers. It is backed by Redis and it is designed to have a low barrier to entry. It should be integrated in your web stack easily. +Asynq is a Go library for queueing tasks and processing them asynchronously with workers. It's backed by Redis and is designed to be scalable yet easy to get started. Highlevel overview of how Asynq works: @@ -42,7 +42,8 @@ A system can consist of multiple worker servers and brokers, giving way to high - Allow [timeout and deadline per task](https://github.com/hibiken/asynq/wiki/Task-Timeout-and-Cancelation) - [Flexible handler interface with support for middlewares](https://github.com/hibiken/asynq/wiki/Handler-Deep-Dive) - [Ability to pause queue](/tools/asynq/README.md#pause) to stop processing tasks from the queue -- [Support Redis Sentinels](https://github.com/hibiken/asynq/wiki/Automatic-Failover) for HA +- [Support Redis Cluster](https://github.com/hibiken/asynq/wiki/Redis-Cluster) for automatic sharding and high availability +- [Support Redis Sentinels](https://github.com/hibiken/asynq/wiki/Automatic-Failover) for high availability - [CLI](#command-line-tool) to inspect and remote-control queues and tasks ## Quickstart @@ -66,8 +67,8 @@ import ( // A list of task types. const ( - EmailDelivery = "email:deliver" - ImageProcessing = "image:process" + TypeEmailDelivery = "email:deliver" + TypeImageResize = "image:resize" ) //---------------------------------------------- @@ -77,19 +78,19 @@ const ( func NewEmailDeliveryTask(userID int, tmplID string) *asynq.Task { payload := map[string]interface{}{"user_id": userID, "template_id": tmplID} - return asynq.NewTask(EmailDelivery, payload) + return asynq.NewTask(TypeEmailDelivery, payload) } -func NewImageProcessingTask(src, dst string) *asynq.Task { - payload := map[string]interface{}{"src": src, "dst": dst} - return asynq.NewTask(ImageProcessing, payload) +func NewImageResizeTask(src string) *asynq.Task { + payload := map[string]interface{}{"src": src} + return asynq.NewTask(TypeImageResize, payload) } //--------------------------------------------------------------- // Write a function HandleXXXTask to handle the input task. // Note that it satisfies the asynq.HandlerFunc interface. -// -// Handler doesn't need to be a function. You can define a type +// +// Handler doesn't need to be a function. You can define a type // that satisfies asynq.Handler interface. See examples below. //--------------------------------------------------------------- @@ -103,7 +104,7 @@ func HandleEmailDeliveryTask(ctx context.Context, t *asynq.Task) error { return err } fmt.Printf("Send Email to User: user_id = %d, template_id = %s\n", userID, tmplID) - // Email delivery logic ... + // Email delivery code ... return nil } @@ -117,12 +118,8 @@ func (p *ImageProcessor) ProcessTask(ctx context.Context, t *asynq.Task) error { if err != nil { return err } - dst, err := t.Payload.GetString("dst") - if err != nil { - return err - } - fmt.Printf("Process image: src = %s, dst = %s\n", src, dst) - // Image processing logic ... + fmt.Printf("Resize image: src = %s\n", src) + // Image resizing code ... return nil } @@ -131,10 +128,7 @@ func NewImageProcessor() *ImageProcessor { } ``` -In your web application code, import the above package and use [`Client`](https://pkg.go.dev/github.com/hibiken/asynq?tab=doc#Client) to put tasks on the queue. -// TODO: This description needs to be updated. -A task will be processed asynchronously by a background worker as soon as the task gets enqueued. -Scheduled tasks will be stored in Redis and will be enqueued at the specified time. +In your application code, import the above package and use [`Client`](https://pkg.go.dev/github.com/hibiken/asynq?tab=doc#Client) to put tasks on the queue. ```go package main @@ -168,11 +162,11 @@ func main() { // ------------------------------------------------------------ // Example 2: Schedule task to be processed in the future. - // Use (*Client).EnqueueIn or (*Client).EnqueueAt. + // Use ProcessIn or ProcessAt option. // ------------------------------------------------------------ t = tasks.NewEmailDeliveryTask(42, "other:template:id") - res, err = c.EnqueueIn(24*time.Hour, t) + res, err = c.Enqueue(t, asynq.ProcessIn(24*time.Hour)) if err != nil { log.Fatal("could not schedule task: %v", err) } @@ -180,13 +174,13 @@ func main() { // ---------------------------------------------------------------------------- - // Example 3: Set options to tune task processing behavior. + // Example 3: Set other options to tune task processing behavior. // Options include MaxRetry, Queue, Timeout, Deadline, Unique etc. // ---------------------------------------------------------------------------- - c.SetDefaultOptions(tasks.ImageProcessing, asynq.MaxRetry(10), asynq.Timeout(time.Minute)) + c.SetDefaultOptions(tasks.ImageProcessing, asynq.MaxRetry(10), asynq.Timeout(3*time.Minute)) - t = tasks.NewImageProcessingTask("some/blobstore/url", "other/blobstore/url") + t = tasks.NewImageResizeTask("some/blobstore/path") res, err = c.Enqueue(t) if err != nil { log.Fatal("could not enqueue task: %v", err) @@ -198,7 +192,7 @@ func main() { // Options passed at enqueue time override default ones, if any. // --------------------------------------------------------------------------- - t = tasks.NewImageProcessingTask("some/blobstore/url", "other/blobstore/url") + t = tasks.NewImageResizeTask("some/blobstore/path") res, err = c.Enqueue(t, asynq.Queue("critical"), asynq.Timeout(30*time.Second)) if err != nil { log.Fatal("could not enqueue task: %v", err) @@ -207,7 +201,7 @@ func main() { } ``` -Next, create a worker server to process these tasks in the background. +Next, start a worker server to process these tasks in the background. To start the background workers, use [`Server`](https://pkg.go.dev/github.com/hibiken/asynq?tab=doc#Server) and provide your [`Handler`](https://pkg.go.dev/github.com/hibiken/asynq?tab=doc#Handler) to process the tasks. You can optionally use [`ServeMux`](https://pkg.go.dev/github.com/hibiken/asynq?tab=doc#ServeMux) to create a handler, just as you would with [`"net/http"`](https://golang.org/pkg/net/http/) Handler. @@ -241,8 +235,8 @@ func main() { // mux maps a type to a handler mux := asynq.NewServeMux() - mux.HandleFunc(tasks.EmailDelivery, tasks.HandleEmailDeliveryTask) - mux.Handle(tasks.ImageProcessing, tasks.NewImageProcessor()) + mux.HandleFunc(tasks.TypeEmailDelivery, tasks.HandleEmailDeliveryTask) + mux.Handle(tasks.TypeImageResize, tasks.NewImageProcessor()) // ...register other handlers... if err := srv.Run(mux); err != nil { @@ -283,7 +277,7 @@ go get -u github.com/hibiken/asynq/tools/asynq | Dependency | Version | | -------------------------- | ------- | -| [Redis](https://redis.io/) | v2.8+ | +| [Redis](https://redis.io/) | v3.0+ | | [Go](https://golang.org/) | v1.13+ | ## Contributing diff --git a/docs/assets/cluster.png b/docs/assets/cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..64951ac0b43089e1511147f3586a6a9bd42d1165 GIT binary patch literal 61095 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 `. + +- `asynq stats` +- `asynq queue [ls inspect history rm pause unpause]` +- `asynq task [ls cancel delete kill run delete-all kill-all run-all]` +- `asynq server [ls]` + +### Global flags Asynq CLI needs to connect to a redis-server to inspect the state of queues and tasks. Use flags to specify the options to connect to the redis-server used by your application. +To connect to a redis cluster, pass `--cluster` and `--cluster_addrs` flags. By default, CLI will try to connect to a redis server running at `localhost:6379`. -### Stats +``` + --config string config file to set flag defaut values (default is $HOME/.asynq.yaml) + -n, --db int redis database number (default is 0) + -h, --help help for asynq + -p, --password string password to use when connecting to redis server + -u, --uri string redis server URI (default "127.0.0.1:6379") -Stats command gives the overview of the current state of tasks and queues. You can run it in conjunction with `watch` command to repeatedly run `stats`. - -Example: - - watch -n 3 asynq stats - -This will run `asynq stats` command every 3 seconds. - -![Gif](/docs/assets/asynq_stats.gif) - -### History - -History command shows the number of processed and failed tasks from the last x days. - -By default, it shows the stats from the last 10 days. Use `--days` to specify the number of days. - -Example: - - asynq history --days=30 - -![Gif](/docs/assets/asynq_history.gif) - -### Servers - -Servers command shows the list of running worker servers pulling tasks from the given redis instance. - -Example: - - asynq servers - -### List - -List command shows all tasks in the specified state in a table format - -Example: - - asynq ls retry - asynq ls scheduled - asynq ls dead - asynq ls enqueued:default - asynq ls inprogress - -### Enqueue - -There are two commands to enqueue tasks. - -Command `enq` takes a task ID and moves the task to **Enqueued** state. You can obtain the task ID by running `ls` command. - -Example: - - asynq enq d:1575732274:bnogo8gt6toe23vhef0g - -Command `enqall` moves all tasks to **Enqueued** state from the specified state. - -Example: - - asynq enqall retry - -Running the above command will move all **Retry** tasks to **Enqueued** state. - -### Delete - -There are two commands for task deletion. - -Command `del` takes a task ID and deletes the task. You can obtain the task ID by running `ls` command. - -Example: - - asynq del r:1575732274:bnogo8gt6toe23vhef0g - -Command `delall` deletes all tasks which are in the specified state. - -Example: - - asynq delall retry - -Running the above command will delete all **Retry** tasks. - -### Kill - -There are two commands to kill (i.e. move to dead state) tasks. - -Command `kill` takes a task ID and kills the task. You can obtain the task ID by running `ls` command. - -Example: - - asynq kill r:1575732274:bnogo8gt6toe23vhef0g - -Command `killall` kills all tasks which are in the specified state. - -Example: - - asynq killall retry - -Running the above command will move all **Retry** tasks to **Dead** state. - -### Cancel - -Command `cancel` takes a task ID and sends a cancelation signal to the goroutine processing the specified task. -You can obtain the task ID by running `ls` command. - -The task should be in "in-progress" state. -Handler implementation needs to be context aware in order to actually stop processing. - -Example: - - asynq cancel bnogo8gt6toe23vhef0g - -### Pause - -Command `pause` pauses the spcified queue. Tasks in paused queues are not processed by servers. -To resume processing from the queue, use `unpause` command. -To see which queues are currently paused, use `stats` command. - -Example: - - asynq pause email - asynq unpause email + --cluster connect to redis cluster + --cluster_addrs string list of comma-separated redis server addresses +``` ## Config File You can use a config file to set default values for the flags. -This is useful, for example when you have to connect to a remote redis server. By default, `asynq` will try to read config file located in -`$HOME/.asynq.(yaml|json)`. You can specify the file location via `--config` flag. +`$HOME/.asynq.(yml|json)`. You can specify the file location via `--config` flag. Config file example: