diff --git a/internal/workflow/dispatcher/dispatcher.go b/internal/workflow/dispatcher/dispatcher.go index 253e1d842..3e0bdffed 100644 --- a/internal/workflow/dispatcher/dispatcher.go +++ b/internal/workflow/dispatcher/dispatcher.go @@ -6,10 +6,8 @@ import ( "fmt" "log" "log/slog" - "os" "runtime" "runtime/debug" - "strconv" "sync" "time" @@ -20,19 +18,15 @@ import ( "github.com/certimate-go/certimate/internal/repository" "github.com/certimate-go/certimate/internal/workflow/engine" "github.com/certimate-go/certimate/pkg/logging" + xenv "github.com/certimate-go/certimate/pkg/utils/env" ) -var maxWorkers = 1 +var envMaxWorkers = 1 func init() { - envMaxWorkers := os.Getenv("CERTIMATE_WORKFLOW_MAX_WORKERS") - if n, _ := strconv.Atoi(envMaxWorkers); n > 0 { - maxWorkers = n - } else { - maxWorkers = runtime.GOMAXPROCS(0) - if maxWorkers == 0 { - maxWorkers = max(1, runtime.NumCPU()) - } + envMaxWorkers = xenv.GetOrDefaultInt("CERTIMATE_WORKFLOW_MAX_WORKERS", runtime.GOMAXPROCS(0)) + if envMaxWorkers <= 0 { + envMaxWorkers = max(1, runtime.NumCPU()) } } @@ -372,7 +366,7 @@ func (wd *workflowDispatcher) tryNextAsync() { func newWorkflowDispatcher() WorkflowDispatcher { return &workflowDispatcher{ - concurrency: maxWorkers, + concurrency: envMaxWorkers, pendingRunQueue: make([]string, 0), processingTasks: make(map[string]*taskInfo), diff --git a/internal/workflow/engine/executor_bizapply.go b/internal/workflow/engine/executor_bizapply.go index 581a822f8..6160f5e53 100644 --- a/internal/workflow/engine/executor_bizapply.go +++ b/internal/workflow/engine/executor_bizapply.go @@ -6,7 +6,6 @@ import ( "log/slog" "maps" "math" - "os" "slices" "strings" "time" @@ -24,15 +23,13 @@ import ( "github.com/certimate-go/certimate/internal/tools/mproc" xcert "github.com/certimate-go/certimate/pkg/utils/cert" xcryptokey "github.com/certimate-go/certimate/pkg/utils/crypto/key" + xenv "github.com/certimate-go/certimate/pkg/utils/env" ) -var useMultiProc = true +var envMultiProc = true func init() { - envMultiProc := os.Getenv("CERTIMATE_WORKFLOW_MULTIPROC") - if envMultiProc == "0" { - useMultiProc = false - } + envMultiProc = xenv.GetOrDefaultBool("CERTIMATE_WORKFLOW_MULTIPROC", true) } const ( @@ -362,7 +359,7 @@ func (ne *bizApplyNodeExecutor) executeObtain(execCtx *NodeExecutionContext, nod } // 如果启用多进程模式,发送指令 - if useMultiProc { + if envMultiProc { type InData struct { Account *certacme.ACMEAccount `json:"account,omitempty"` Request *certacme.ObtainCertificateRequest `json:"request,omitempty"` diff --git a/pkg/utils/env/get.go b/pkg/utils/env/get.go new file mode 100644 index 000000000..dbb7dd245 --- /dev/null +++ b/pkg/utils/env/get.go @@ -0,0 +1,93 @@ +package env + +import ( + "errors" + "os" + "strconv" +) + +// 以字符串形式读取指定环境变量的值。 +// +// 入参: +// - envVar:环境变量。 +// +// 出参: +// - 环境变量值。 +func GetString(envVar string) string { + return GetOrDefaultString(envVar, "") +} + +// 以字符串形式读取指定环境变量的值。 +// +// 入参: +// - envVar:环境变量。 +// - defaultValue: 默认值。 +// +// 出参: +// - 环境变量值。如果指定环境变量不存在、或者值为零值,则返回默认值。 +func GetOrDefaultString(envVar, defaultValue string) string { + return getOrDefault(envVar, defaultValue, parseString) +} + +// 以整数形式读取指定环境变量的值。 +// +// 入参: +// - envVar:环境变量。 +// +// 出参: +// - 环境变量值。 +func GetInt(envVar string) int { + return GetOrDefaultInt(envVar, 0) +} + +// 以整数形式读取指定环境变量的值。 +// +// 入参: +// - envVar:环境变量。 +// - defaultValue: 默认值。 +// +// 出参: +// - 环境变量值。如果指定环境变量不存在、或者值的类型不是整数,则返回默认值。 +func GetOrDefaultInt(envVar string, defaultValue int) int { + return getOrDefault(envVar, defaultValue, strconv.Atoi) +} + +// 以布尔形式读取指定环境变量的值。 +// +// 入参: +// - envVar:环境变量。 +// +// 出参: +// - 环境变量值。 +func GetBool(envVar string) bool { + return GetOrDefaultBool(envVar, false) +} + +// 以布尔形式读取指定环境变量的值。 +// +// 入参: +// - envVar:环境变量。 +// - defaultValue: 默认值。 +// +// 出参: +// - 环境变量值。如果指定环境变量不存在、或者值的类型不是布尔,则返回默认值。 +func GetOrDefaultBool(envVar string, defaultValue bool) bool { + return getOrDefault(envVar, defaultValue, strconv.ParseBool) +} + +func getOrDefault[T any](envVar string, defaultValue T, parser func(string) (T, error)) T { + v, err := parser(os.Getenv(envVar)) + if err != nil { + return defaultValue + } + + return v +} + +func parseString(s string) (string, error) { + if s == "" { + return "", errors.New("empty string") + } + + return s, nil +} diff --git a/pkg/utils/maps/get.go b/pkg/utils/maps/get.go index 8f8dc1bc6..cef45d71a 100644 --- a/pkg/utils/maps/get.go +++ b/pkg/utils/maps/get.go @@ -11,7 +11,7 @@ import ( // - key: 键。 // // 出参: -// - 字典中键对应的值。如果指定键不存在或者值的类型不是字符串,则返回空字符串。 +// - 字典中键对应的值。如果指定键不存在、或者值的类型不是字符串,则返回空字符串。 func GetString(dict map[string]any, key string) string { return GetOrDefaultString(dict, key, "") } @@ -24,7 +24,7 @@ func GetString(dict map[string]any, key string) string { // - defaultValue: 默认值。 // // 出参: -// - 字典中键对应的值。如果指定键不存在、值的类型不是字符串或者值为零值,则返回默认值。 +// - 字典中键对应的值。如果指定键不存在、值的类型不是字符串、或者值为零值,则返回默认值。 func GetOrDefaultString(dict map[string]any, key string, defaultValue string) string { if dict == nil { return defaultValue @@ -48,7 +48,7 @@ func GetOrDefaultString(dict map[string]any, key string, defaultValue string) st // - key: 键。 // // 出参: -// - 字典中键对应的值。如果指定键不存在或者值的类型不是整数,则返回 0。 +// - 字典中键对应的值。如果指定键不存在、或者值的类型不是整数,则返回 0。 func GetInt(dict map[string]any, key string) int { return GetOrDefaultInt(dict, key, 0) } @@ -61,7 +61,7 @@ func GetInt(dict map[string]any, key string) int { // - defaultValue: 默认值。 // // 出参: -// - 字典中键对应的值。如果指定键不存在、值的类型不是整数或者值为零值,则返回默认值。 +// - 字典中键对应的值。如果指定键不存在、值的类型不是整数、或者值为零值,则返回默认值。 func GetOrDefaultInt(dict map[string]any, key string, defaultValue int) int { if dict == nil { return defaultValue @@ -117,7 +117,7 @@ func GetOrDefaultInt(dict map[string]any, key string, defaultValue int) int { // - key: 键。 // // 出参: -// - 字典中键对应的值。如果指定键不存在或者值的类型不是 32 位整数,则返回 0。 +// - 字典中键对应的值。如果指定键不存在、或者值的类型不是 32 位整数,则返回 0。 func GetInt32(dict map[string]any, key string) int32 { return GetOrDefaultInt32(dict, key, 0) } @@ -130,7 +130,7 @@ func GetInt32(dict map[string]any, key string) int32 { // - defaultValue: 默认值。 // // 出参: -// - 字典中键对应的值。如果指定键不存在、值的类型不是 32 位整数或者值为零值,则返回默认值。 +// - 字典中键对应的值。如果指定键不存在、值的类型不是 32 位整数、或者值为零值,则返回默认值。 func GetOrDefaultInt32(dict map[string]any, key string, defaultValue int32) int32 { if dict == nil { return defaultValue @@ -186,7 +186,7 @@ func GetOrDefaultInt32(dict map[string]any, key string, defaultValue int32) int3 // - key: 键。 // // 出参: -// - 字典中键对应的值。如果指定键不存在或者值的类型不是 64 位整数,则返回 0。 +// - 字典中键对应的值。如果指定键不存在、或者值的类型不是 64 位整数,则返回 0。 func GetInt64(dict map[string]any, key string) int64 { return GetOrDefaultInt64(dict, key, 0) } @@ -199,7 +199,7 @@ func GetInt64(dict map[string]any, key string) int64 { // - defaultValue: 默认值。 // // 出参: -// - 字典中键对应的值。如果指定键不存在、值的类型不是 64 位整数或者值为零值,则返回默认值。 +// - 字典中键对应的值。如果指定键不存在、值的类型不是 64 位整数、或者值为零值,则返回默认值。 func GetOrDefaultInt64(dict map[string]any, key string, defaultValue int64) int64 { if dict == nil { return defaultValue @@ -255,7 +255,7 @@ func GetOrDefaultInt64(dict map[string]any, key string, defaultValue int64) int6 // - key: 键。 // // 出参: -// - 字典中键对应的值。如果指定键不存在或者值的类型不是布尔,则返回 false。 +// - 字典中键对应的值。如果指定键不存在、或者值的类型不是布尔,则返回 false。 func GetBool(dict map[string]any, key string) bool { return GetOrDefaultBool(dict, key, false) } @@ -268,7 +268,7 @@ func GetBool(dict map[string]any, key string) bool { // - defaultValue: 默认值。 // // 出参: -// - 字典中键对应的值。如果指定键不存在或者值的类型不是布尔,则返回默认值。 +// - 字典中键对应的值。如果指定键不存在、或者值的类型不是布尔,则返回默认值。 func GetOrDefaultBool(dict map[string]any, key string, defaultValue bool) bool { if dict == nil { return defaultValue