2
0
mirror of https://github.com/hibiken/asynq.git synced 2024-12-25 23:32:17 +08:00
asynq/asynq.go

144 lines
3.9 KiB
Go
Raw Normal View History

2020-01-03 10:13:16 +08:00
// Copyright 2020 Kentaro Hibino. All rights reserved.
// Use of this source code is governed by a MIT license
// that can be found in the LICENSE file.
2019-11-15 13:07:19 +08:00
package asynq
import (
"crypto/tls"
"fmt"
"github.com/go-redis/redis/v7"
)
2019-11-17 06:45:51 +08:00
2020-02-07 12:46:59 +08:00
// Task represents a unit of work to be performed.
2019-11-15 13:07:19 +08:00
type Task struct {
// Type indicates the type of task to be performed.
2019-11-17 06:45:51 +08:00
Type string
2020-01-17 11:50:45 +08:00
// Payload holds data needed to perform the task.
2019-12-19 23:13:43 +08:00
Payload Payload
2019-11-15 13:07:19 +08:00
}
2020-02-07 12:46:59 +08:00
// NewTask returns a new Task given a type name and payload data.
//
2020-02-07 12:46:59 +08:00
// The payload values must be serializable.
func NewTask(typename string, payload map[string]interface{}) *Task {
return &Task{
Type: typename,
Payload: Payload{payload},
}
}
2020-02-07 12:46:59 +08:00
// RedisConnOpt is a discriminated union of types that represent Redis connection configuration option.
//
// RedisConnOpt represents a sum of following types:
2020-01-17 11:50:45 +08:00
//
// RedisClientOpt | *RedisClientOpt | RedisFailoverClientOpt | *RedisFailoverClientOpt
type RedisConnOpt interface{}
2020-01-17 11:50:45 +08:00
// RedisClientOpt is used to create a redis client that connects
// to a redis server directly.
type RedisClientOpt struct {
// Network type to use, either tcp or unix.
// Default is tcp.
Network string
2020-01-17 11:50:45 +08:00
// Redis server address in "host:port" format.
Addr string
// Redis server password.
Password string
2020-02-07 12:46:59 +08:00
// Redis DB to select after connecting to a server.
// See: https://redis.io/commands/select.
DB int
// Maximum number of socket connections.
// Default is 10 connections per every CPU as reported by runtime.NumCPU.
PoolSize int
2020-02-07 12:46:59 +08:00
// TLS Config used to connect to a server.
// TLS will be negotiated only if this field is set.
TLSConfig *tls.Config
}
2020-01-17 11:50:45 +08:00
// RedisFailoverClientOpt is used to creates a redis client that talks
2020-02-07 12:46:59 +08:00
// to redis sentinels for service discovery and has an automatic failover
2020-01-17 11:50:45 +08:00
// capability.
type RedisFailoverClientOpt struct {
// Redis master name that monitored by sentinels.
MasterName string
2020-01-17 11:50:45 +08:00
// Addresses of sentinels in "host:port" format.
// Use at least three sentinels to avoid problems described in
// https://redis.io/topics/sentinel.
SentinelAddrs []string
// Redis sentinel password.
SentinelPassword string
// Redis server password.
Password string
2020-02-07 12:46:59 +08:00
// Redis DB to select after connecting to a server.
// See: https://redis.io/commands/select.
DB int
// Maximum number of socket connections.
// Default is 10 connections per every CPU as reported by runtime.NumCPU.
PoolSize int
2020-02-07 12:46:59 +08:00
// TLS Config used to connect to a server.
// TLS will be negotiated only if this field is set.
TLSConfig *tls.Config
}
2020-02-07 12:46:59 +08:00
// createRedisClient returns a redis client given a redis connection configuration.
//
// Passing an unexpected type as a RedisConnOpt argument will cause panic.
func createRedisClient(r RedisConnOpt) *redis.Client {
switch r := r.(type) {
case *RedisClientOpt:
return redis.NewClient(&redis.Options{
Network: r.Network,
Addr: r.Addr,
Password: r.Password,
DB: r.DB,
PoolSize: r.PoolSize,
TLSConfig: r.TLSConfig,
})
case RedisClientOpt:
return redis.NewClient(&redis.Options{
Network: r.Network,
Addr: r.Addr,
Password: r.Password,
DB: r.DB,
PoolSize: r.PoolSize,
TLSConfig: r.TLSConfig,
})
case *RedisFailoverClientOpt:
return redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: r.MasterName,
SentinelAddrs: r.SentinelAddrs,
SentinelPassword: r.SentinelPassword,
Password: r.Password,
DB: r.DB,
PoolSize: r.PoolSize,
TLSConfig: r.TLSConfig,
})
case RedisFailoverClientOpt:
return redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: r.MasterName,
SentinelAddrs: r.SentinelAddrs,
SentinelPassword: r.SentinelPassword,
Password: r.Password,
DB: r.DB,
PoolSize: r.PoolSize,
TLSConfig: r.TLSConfig,
})
default:
panic(fmt.Sprintf("asynq: unexpected type %T for RedisConnOpt", r))
}
}