168 lines
4.6 KiB
Go
168 lines
4.6 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net"
|
||
|
|
||
|
"go-common/app/interface/main/account/service/realname/crypto"
|
||
|
"go-common/app/job/main/member/conf"
|
||
|
"go-common/app/job/main/member/dao"
|
||
|
"go-common/app/job/main/member/model"
|
||
|
"go-common/app/job/main/member/model/queue"
|
||
|
"go-common/app/job/main/member/service/block"
|
||
|
memrpc "go-common/app/service/main/member/api/gorpc"
|
||
|
"go-common/library/log"
|
||
|
"go-common/library/log/infoc"
|
||
|
"go-common/library/queue/databus"
|
||
|
"go-common/library/queue/databus/databusutil"
|
||
|
|
||
|
"golang.org/x/time/rate"
|
||
|
)
|
||
|
|
||
|
// Service struct of service.
|
||
|
type Service struct {
|
||
|
c *conf.Config
|
||
|
dao *dao.Dao
|
||
|
block *block.Service
|
||
|
ds *databus.Databus
|
||
|
accDs *databus.Databus
|
||
|
passortDs *databus.Databus
|
||
|
logDatabus *databus.Databus
|
||
|
expDatabus *databus.Databus
|
||
|
realnameDatabus *databus.Databus
|
||
|
shareMidDatabus *databus.Databus
|
||
|
loginGroup *databusutil.Group
|
||
|
awardGroup *databusutil.Group
|
||
|
memrpc *memrpc.Service
|
||
|
cachepq *queue.PriorityQueue
|
||
|
alipayCryptor *crypto.Alipay
|
||
|
limiter *limiter
|
||
|
ParsedRealnameInfoc *infoc.Infoc
|
||
|
}
|
||
|
|
||
|
type limiter struct {
|
||
|
UpdateExp *rate.Limiter
|
||
|
}
|
||
|
|
||
|
// New create service instance and return.
|
||
|
func New(c *conf.Config) (s *Service) {
|
||
|
s = &Service{
|
||
|
c: c,
|
||
|
ds: databus.New(c.DataBus),
|
||
|
accDs: databus.New(c.AccDataBus),
|
||
|
passortDs: databus.New(c.PassortDataBus),
|
||
|
logDatabus: databus.New(c.LogDatabus),
|
||
|
expDatabus: databus.New(c.ExpDatabus),
|
||
|
realnameDatabus: databus.New(c.RealnameDatabus),
|
||
|
shareMidDatabus: databus.New(c.ShareMidDatabus),
|
||
|
alipayCryptor: crypto.NewAlipay(string(c.RealnameAlipayPub), string(c.RealnameAlipayBiliPriv)),
|
||
|
loginGroup: databusutil.NewGroup(c.Databusutil, databus.New(c.LoginDatabus).Messages()),
|
||
|
awardGroup: databusutil.NewGroup(c.Databusutil, databus.New(c.AwardDatabus).Messages()),
|
||
|
memrpc: memrpc.New(nil),
|
||
|
cachepq: queue.NewPriorityQueue(1024, false),
|
||
|
limiter: &limiter{
|
||
|
UpdateExp: rate.NewLimiter(200, 10),
|
||
|
},
|
||
|
ParsedRealnameInfoc: infoc.New(c.ParsedRealnameInfoc),
|
||
|
}
|
||
|
s.dao = dao.New(c)
|
||
|
s.block = block.New(c, s.dao.BlockImpl(), databus.New(c.BlockCreditDatabus))
|
||
|
s.loginGroup.New = newMsg
|
||
|
s.loginGroup.Split = split
|
||
|
s.loginGroup.Do = s.awardDo
|
||
|
s.awardGroup.New = newMsg
|
||
|
s.awardGroup.Split = split
|
||
|
s.awardGroup.Do = s.awardDo
|
||
|
s.loginGroup.Start()
|
||
|
s.awardGroup.Start()
|
||
|
go s.passportSubproc()
|
||
|
go s.realnameSubproc()
|
||
|
go s.realnamealipaycheckproc()
|
||
|
go s.cachedelayproc(context.Background())
|
||
|
go s.shareMidproc()
|
||
|
accproc := int32(10)
|
||
|
expproc := int32(1)
|
||
|
if c.Biz.AccprocCount > accproc {
|
||
|
accproc = c.Biz.AccprocCount
|
||
|
}
|
||
|
if c.Biz.ExpprocCount > expproc {
|
||
|
expproc = c.Biz.ExpprocCount
|
||
|
}
|
||
|
log.Info("Starting %d account sub proc", accproc)
|
||
|
for i := 0; i < int(accproc); i++ {
|
||
|
go s.subproc()
|
||
|
go s.accSubproc()
|
||
|
go s.logproc()
|
||
|
}
|
||
|
log.Info("Starting %d exp sub proc", expproc)
|
||
|
for i := 0; i < int(expproc); i++ {
|
||
|
go s.expproc()
|
||
|
}
|
||
|
if s.c.FeatureGates.DataFixer && s.dao.LeaderEleciton(context.Background()) {
|
||
|
fmt.Println("Leader elected")
|
||
|
// 数据检查
|
||
|
s.makeChan(30)
|
||
|
go s.dataCheckMids()
|
||
|
for i := 0; i < 60; i++ {
|
||
|
go s.dataFixer(csclice[i%30])
|
||
|
}
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func split(msg *databus.Message, data interface{}) int {
|
||
|
t, ok := data.(*model.LoginLogIPString)
|
||
|
if !ok {
|
||
|
return 0
|
||
|
}
|
||
|
return int(t.Mid)
|
||
|
}
|
||
|
|
||
|
func newMsg(msg *databus.Message) (res interface{}, err error) {
|
||
|
llm := new(model.LoginLogIPString)
|
||
|
ll := new(model.LoginLog)
|
||
|
if err = json.Unmarshal(msg.Value, &llm); err != nil {
|
||
|
if err = json.Unmarshal(msg.Value, &ll); err != nil {
|
||
|
msg.Commit()
|
||
|
log.Error("json.Unmarshal(%s) error(%v)", msg.Value, err)
|
||
|
return
|
||
|
}
|
||
|
llm.Mid = ll.Mid
|
||
|
llm.Timestamp = ll.Timestamp
|
||
|
llm.Loginip = inetNtoA(uint32(ll.Loginip))
|
||
|
}
|
||
|
res = llm
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func inetNtoA(sum uint32) string {
|
||
|
ip := make(net.IP, net.IPv4len)
|
||
|
ip[0] = byte((sum >> 24) & 0xFF)
|
||
|
ip[1] = byte((sum >> 16) & 0xFF)
|
||
|
ip[2] = byte((sum >> 8) & 0xFF)
|
||
|
ip[3] = byte(sum & 0xFF)
|
||
|
return ip.String()
|
||
|
}
|
||
|
|
||
|
// Ping check service health.
|
||
|
func (s *Service) Ping(c context.Context) error {
|
||
|
return s.dao.Ping(c)
|
||
|
}
|
||
|
|
||
|
// Close kafka consumer close.
|
||
|
func (s *Service) Close() (err error) {
|
||
|
if err = s.ds.Close(); err != nil {
|
||
|
log.Error("s.ds.Close(),err(%v)", err)
|
||
|
}
|
||
|
if err = s.accDs.Close(); err != nil {
|
||
|
log.Error("s.accDs.Close(),err(%v)", err)
|
||
|
}
|
||
|
if err = s.passortDs.Close(); err != nil {
|
||
|
log.Error("s.passportDs.Close(),err(%v)", err)
|
||
|
}
|
||
|
s.block.Close()
|
||
|
return
|
||
|
}
|