113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
|
package service
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"go-common/app/job/bbq/video/dao"
|
|||
|
"go-common/library/log"
|
|||
|
"go-common/library/sync/errgroup"
|
|||
|
"sync/atomic"
|
|||
|
"time"
|
|||
|
|
|||
|
notice "go-common/app/service/bbq/notice-service/api/v1"
|
|||
|
)
|
|||
|
|
|||
|
// 信号量,为了避免task执行超过周期,连续执行两个任务会出现问题
|
|||
|
var i32 int32
|
|||
|
|
|||
|
// SysMsgTask 推送消息
|
|||
|
func (s *Service) SysMsgTask() {
|
|||
|
ctx := context.Background()
|
|||
|
newValue := atomic.AddInt32(&i32, 1)
|
|||
|
defer atomic.AddInt32(&i32, -1)
|
|||
|
if newValue > 1 {
|
|||
|
log.Errorv(ctx, log.KV("log", "sysMsgTask pending"))
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
res, err := s.dao.RawCheckTask(ctx, "checkSysMsg")
|
|||
|
if err != nil {
|
|||
|
log.Errorv(ctx, log.KV("log", "get last sysMsgTask id fail"))
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
lastSysMsgID := res.LastCheck
|
|||
|
curSysMsgID := res.LastCheck
|
|||
|
list, err := s.dao.GetNewSysMsg(ctx, curSysMsgID)
|
|||
|
if err != nil {
|
|||
|
log.Errorv(ctx, log.KV("log", "get new sysMsg fail"))
|
|||
|
return
|
|||
|
}
|
|||
|
if len(list) == 0 {
|
|||
|
log.Infov(ctx, log.KV("log", "no new sys msg to be sync to notice"))
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
var mids []int64
|
|||
|
for _, item := range list {
|
|||
|
curSysMsgID = item.Id
|
|||
|
|
|||
|
notice := notice.NoticeBase{
|
|||
|
Mid: item.Receiver,
|
|||
|
ActionMid: item.Sender,
|
|||
|
SvId: 0,
|
|||
|
NoticeType: 4,
|
|||
|
Text: item.Text,
|
|||
|
JumpUrl: item.JumpUrl,
|
|||
|
BizType: dao.NoticeBizTypeSysMsg,
|
|||
|
BizId: item.Id,
|
|||
|
}
|
|||
|
// 全量系统消息
|
|||
|
if item.Receiver == 0 {
|
|||
|
lastUserID := int64(0)
|
|||
|
if len(mids) == 0 {
|
|||
|
for {
|
|||
|
if userBases, err := s.dao.UsersByLast(ctx, lastUserID); err != nil {
|
|||
|
log.Errorv(ctx, log.KV("log", "sys msg task: get user base fail"))
|
|||
|
break
|
|||
|
} else {
|
|||
|
for _, userBase := range userBases {
|
|||
|
mids = append(mids, userBase.MID)
|
|||
|
}
|
|||
|
if len(userBases) > 0 {
|
|||
|
lastUserID = userBases[len(userBases)-1].ID
|
|||
|
} else {
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
midChan := make(chan int64, 20)
|
|||
|
go func() {
|
|||
|
for _, mid := range mids {
|
|||
|
midChan <- mid
|
|||
|
}
|
|||
|
close(midChan)
|
|||
|
}()
|
|||
|
startTime := time.Now()
|
|||
|
g := errgroup.Group{}
|
|||
|
for i := 0; i < 10; i++ {
|
|||
|
g.Go(func() error {
|
|||
|
subNotice := notice
|
|||
|
for mid := range midChan {
|
|||
|
subNotice.Mid = mid
|
|||
|
s.dao.CreateNotice(ctx, &subNotice)
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
}
|
|||
|
g.Wait()
|
|||
|
log.Info("total sys msg notice push: cost_time=%f, mid_len=%d", time.Since(startTime).Seconds(), len(mids))
|
|||
|
} else {
|
|||
|
s.dao.CreateNotice(ctx, ¬ice)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if _, err := s.dao.UpdateTaskLastCheck(ctx, "checkSysMsg", curSysMsgID); err != nil {
|
|||
|
log.Errorv(ctx, log.KV("log", "update check_task mysql fail"))
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
log.Infov(ctx, log.KV("log", "no new sys msg to be sync to notice"), log.KV("last_sys_id", lastSysMsgID), log.KV("cur_sys_id", curSysMsgID))
|
|||
|
}
|