124 lines
2.7 KiB
Go
124 lines
2.7 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"go-common/app/job/main/archive-shjd/model"
|
|
"go-common/app/service/main/archive/api"
|
|
"go-common/app/service/main/archive/model/archive"
|
|
"go-common/library/log"
|
|
"go-common/library/queue/databus"
|
|
)
|
|
|
|
// consumerproc consumer all topic
|
|
func (s *Service) consumerproc(k string, d *databus.Databus) {
|
|
defer s.waiter.Done()
|
|
var msgs = d.Messages()
|
|
for {
|
|
var (
|
|
err error
|
|
ok bool
|
|
msg *databus.Message
|
|
now = time.Now().Unix()
|
|
)
|
|
msg, ok = <-msgs
|
|
if !ok || s.close {
|
|
log.Info("databus(%s) consumer exit", k)
|
|
return
|
|
}
|
|
msg.Commit()
|
|
var ms = &model.StatCount{}
|
|
if err = json.Unmarshal(msg.Value, ms); err != nil {
|
|
log.Error("json.Unmarshal(%s) error(%v)", string(msg.Value), err)
|
|
continue
|
|
}
|
|
if ms.Aid <= 0 || (ms.Type != "archive" && ms.Type != "archive_his") {
|
|
log.Warn("message(%s) error", msg.Value)
|
|
continue
|
|
}
|
|
if now-ms.TimeStamp > 1800 {
|
|
log.Warn("topic(%s) message(%s) too early", msg.Topic, msg.Value)
|
|
continue
|
|
}
|
|
stat := &model.StatMsg{Aid: ms.Aid, Type: k, Ts: ms.TimeStamp}
|
|
switch k {
|
|
case model.TypeForView:
|
|
stat.Click = ms.Count
|
|
case model.TypeForDm:
|
|
stat.DM = ms.Count
|
|
case model.TypeForReply:
|
|
stat.Reply = ms.Count
|
|
case model.TypeForFav:
|
|
stat.Fav = ms.Count
|
|
case model.TypeForCoin:
|
|
stat.Coin = ms.Count
|
|
case model.TypeForShare:
|
|
stat.Share = ms.Count
|
|
case model.TypeForRank:
|
|
stat.HisRank = ms.Count
|
|
case model.TypeForLike:
|
|
stat.Like = ms.Count
|
|
default:
|
|
log.Error("unknow type(%s) message(%s)", k, msg.Value)
|
|
continue
|
|
}
|
|
s.subStatCh[stat.Aid%_sharding] <- stat
|
|
log.Info("got message(%+v)", stat)
|
|
}
|
|
}
|
|
|
|
func (s *Service) statDealproc(i int) {
|
|
defer s.waiter.Done()
|
|
var (
|
|
ch = s.subStatCh[i]
|
|
sm = s.statSM[i]
|
|
c = context.TODO()
|
|
ls *lastTmStat
|
|
err error
|
|
)
|
|
for {
|
|
ms, ok := <-ch
|
|
if !ok {
|
|
log.Info("statDealproc(%d) quit", i)
|
|
return
|
|
}
|
|
// get stat
|
|
if ls, ok = sm[ms.Aid]; !ok {
|
|
var stat *api.Stat
|
|
for _, arc := range s.arcRPCs {
|
|
if stat, err = arc.Stat3(c, &archive.ArgAid2{Aid: ms.Aid}); err == nil {
|
|
break
|
|
}
|
|
}
|
|
if stat == nil {
|
|
log.Error("stat(%d) is nill", ms.Aid)
|
|
continue
|
|
}
|
|
ls = &lastTmStat{}
|
|
ls.stat = stat
|
|
sm[ms.Aid] = ls
|
|
}
|
|
model.Merge(ms, ls.stat)
|
|
// update cache
|
|
st := &api.Stat{
|
|
Aid: ls.stat.Aid,
|
|
View: ls.stat.View,
|
|
Danmaku: ls.stat.Danmaku,
|
|
Reply: ls.stat.Reply,
|
|
Fav: ls.stat.Fav,
|
|
Coin: ls.stat.Coin,
|
|
Share: ls.stat.Share,
|
|
NowRank: ls.stat.NowRank,
|
|
HisRank: ls.stat.HisRank,
|
|
Like: ls.stat.Like,
|
|
}
|
|
for cluster, arc := range s.arcRPCs {
|
|
if err = arc.SetStat2(c, st); err != nil {
|
|
log.Error("s.arcRPC.SetStat2(%s) (%+v) error(%v)", cluster, st, err)
|
|
}
|
|
}
|
|
}
|
|
}
|