go-common/app/job/main/member/service/service.go

168 lines
4.6 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}