From 92c0036bc11e978757c10f49f8438a44b60be265 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Fri, 15 Sep 2023 21:28:39 +0800 Subject: [PATCH] use a cron job to update max history online user count --- README.md | 2 +- features-status.md | 2 +- internal/conf/conf.go | 2 ++ internal/conf/config.yaml | 2 ++ internal/conf/setting.go | 4 ++++ internal/events/events.go | 4 ++-- internal/servants/web/jobs.go | 41 +++++++++++++++++++++++++++++++++++ internal/servants/web/web.go | 2 ++ 8 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 internal/servants/web/jobs.go diff --git a/README.md b/README.md index e8f98f80..a38e0ad3 100644 --- a/README.md +++ b/README.md @@ -384,7 +384,7 @@ release/paopao serve --no-default-features --features sqlite3,localoss,loggerfil |[`Pprof`](docs/proposal/23062905-添加Pprof功能特性用于获取Profile.md)| 性能优化 | 内测 | 开启Pprof功能收集Profile信息 | |`PhoneBind` | 其他 | 稳定 | 手机绑定功能 | |`UseAuditHook` | 其他 | 内测 | 使用审核hook功能 | -|`UseJobManager` | 其他 | 内测 | 使用JobManager功能 | +|`DisableJobManager` | 其他 | 内测 | 禁止使用JobManager功能 | |`Web:DisallowUserRegister` | 功能特性 | 稳定 | 不允许用户注册 | > 功能项状态详情参考 [features-status](features-status.md). diff --git a/features-status.md b/features-status.md index 4949fdc8..c6cf5aa0 100644 --- a/features-status.md +++ b/features-status.md @@ -203,7 +203,7 @@ * [x] 接口定义 * [x] 业务逻辑实现 -* `UseJobManager` 使用JobManager功能 (目前状态: 内测 待完善后将转为Builtin) +* `DisableJobManager` 禁止使用JobManager功能 (目前状态: 内测 待完善后将转为Builtin) * [ ] 提按文档 * [x] 接口定义 * [x] 业务逻辑实现 diff --git a/internal/conf/conf.go b/internal/conf/conf.go index 7880db81..fb15b45b 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -38,6 +38,7 @@ var ( CacheSetting *cacheConf EventManagerSetting *eventManagerConf MetricManagerSetting *metricManagerConf + JobManagerSetting *jobManagerConf CacheIndexSetting *cacheIndexConf SimpleCacheIndexSetting *simpleCacheIndexConf BigCacheIndexSetting *bigCacheIndexConf @@ -75,6 +76,7 @@ func setupSetting(suite []string, noDefault bool) error { "Cache": &CacheSetting, "EventManager": &EventManagerSetting, "MetricManager": &MetricManagerSetting, + "JobManager": &JobManagerSetting, "PprofServer": &PprofServerSetting, "WebServer": &WebServerSetting, "AdminServer": &AdminServerSetting, diff --git a/internal/conf/config.yaml b/internal/conf/config.yaml index e076c42c..0721eee8 100644 --- a/internal/conf/config.yaml +++ b/internal/conf/config.yaml @@ -23,6 +23,8 @@ MetricManager: # 指标监控管理器的配置参数 MaxTempEventBuf: 256 # 最大log缓存条数, 设置范围[10, ++], 默认256 MaxTickCount: 60 # 最大的循环周期, 设置范围[60, ++], 默认60 TickWaitTime: 1 # 一个周期的等待时间,单位:秒 默认1s +JobManager: # Cron Job理器的配置参数 + MaxOnlineInterval: "@every 5m" # 更新最大在线人数,默认每5分钟更新一次 Features: Default: [] WebServer: # Web服务 diff --git a/internal/conf/setting.go b/internal/conf/setting.go index 30802602..5c065050 100644 --- a/internal/conf/setting.go +++ b/internal/conf/setting.go @@ -120,6 +120,10 @@ type metricManagerConf struct { TickWaitTime time.Duration } +type jobManagerConf struct { + MaxOnlineInterval string +} + type cacheIndexConf struct { MaxUpdateQPS int MinWorker int diff --git a/internal/events/events.go b/internal/events/events.go index f981c93a..17b84bda 100644 --- a/internal/events/events.go +++ b/internal/events/events.go @@ -73,10 +73,10 @@ func Schedule(s cron.Schedule, fn JobFn) EntryID { func Initial() { _onceInitial.Do(func() { initEventManager() - if cfg.If("UseJobManager") { + cfg.Not("DisableJobManager", func() { initJobManager() logrus.Debugln("initial JobManager") - } + }) }) } diff --git a/internal/servants/web/jobs.go b/internal/servants/web/jobs.go new file mode 100644 index 00000000..0d5f0b84 --- /dev/null +++ b/internal/servants/web/jobs.go @@ -0,0 +1,41 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/alimy/tryst/cfg" + "github.com/robfig/cron/v3" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/events" + "github.com/sirupsen/logrus" +) + +func onMaxOnlineJob() { + spec := conf.JobManagerSetting.MaxOnlineInterval + schedule, err := cron.ParseStandard(spec) + if err != nil { + panic(err) + } + events.Schedule(schedule, func() { + onlineUserKeys, err := _wc.Keys(conf.PrefixOnlineUser + "*") + if maxOnline := len(onlineUserKeys); err == nil && maxOnline > 0 { + if _, err = _wc.PutHistoryMaxOnline(maxOnline); err != nil { + logrus.Warnf("onMaxOnlineJob[2] occurs error: %s", err) + } else { + logrus.Debug("trigger onMaxOnlineJob run action") + } + } else if err != nil { + logrus.Warnf("onMaxOnlineJob[1] occurs error: %s", err) + } + }) +} + +func scheduleInnerJobs() { + cfg.Not("DisableJobManager", func() { + lazyInitial() + onMaxOnlineJob() + logrus.Debug("schedule inner jobs complete") + }) +} diff --git a/internal/servants/web/web.go b/internal/servants/web/web.go index 883a2481..af739942 100644 --- a/internal/servants/web/web.go +++ b/internal/servants/web/web.go @@ -46,6 +46,8 @@ func RouteWeb(e *gin.Engine) { api.RegisterAlipayPubServant(e, newAlipayPubSrv(ds)) api.RegisterAlipayPrivServant(e, newAlipayPrivSrv(ds, client)) }) + // shedule inner jobs if need + scheduleInnerJobs() } // lazyInitial do some package lazy initialize for performance