移除监控功能,不合理

This commit is contained in:
kercylan98 2023-05-24 11:29:20 +08:00
parent 6680a348c9
commit 32c08c6106
5 changed files with 0 additions and 475 deletions

View File

@ -1,104 +0,0 @@
package main
import (
"github.com/kercylan98/minotaur/component/components"
"github.com/kercylan98/minotaur/game/builtin"
"github.com/kercylan98/minotaur/server"
"github.com/kercylan98/minotaur/utils/log"
"github.com/kercylan98/minotaur/utils/random"
"github.com/kercylan98/minotaur/utils/synchronization"
"github.com/kercylan98/minotaur/utils/timer"
"go.uber.org/zap"
"time"
)
type Player struct {
*builtin.Player[string]
}
type Command struct {
CMD int
Data string
}
// 访问http://www.websocket-test.com/
// - 使用多个页面连接到服务器后任一页面发送start即可开启帧同步
func main() {
players := synchronization.NewMap[string, *Player]()
srv := server.New(server.NetworkWebsocket,
server.WithWebsocketWriteMessageType(server.WebsocketMessageTypeText),
server.WithTicker(20, false),
server.WithMonitor(),
)
lockstep := components.NewLockstep[string, *Command]()
srv.RegStartFinishEvent(func(srv *server.Server) {
srv.Ticker().Loop("monitor", timer.Instantly, time.Second/2, timer.Forever, func() {
m := srv.GetMonitor()
log.Info("Monitor.Message",
zap.Any("Total", m.MessageTotal()),
zap.Any("Second", m.MessageSecond()),
zap.Any("Cost", m.MessageCost()),
zap.Any("DoneAvg", m.MessageDoneAvg()),
zap.Any("QPS", m.MessageQPS()),
zap.Any("TopQPS", m.MessageTopQPS()),
)
log.Info("Monitor.Cross",
zap.Any("Total", m.CrossMessageTotal()),
zap.Any("Second", m.CrossMessageSecond()),
zap.Any("Cost", m.CrossMessageCost()),
zap.Any("DoneAvg", m.CrossMessageDoneAvg()),
zap.Any("QPS", m.MessageQPS()),
zap.Any("TopQPS", m.CrossMessageTopQPS()),
)
log.Info("Monitor.Packet",
zap.Any("Total", m.PacketMessageTotal()),
zap.Any("Second", m.PacketMessageSecond()),
zap.Any("Cost", m.PacketMessageCost()),
zap.Any("DoneAvg", m.PacketMessageDoneAvg()),
zap.Any("QPS", m.PacketMessageQPS()),
zap.Any("TopQPS", m.PacketMessageTopQPS()),
)
log.Info("Monitor.Ticker",
zap.Any("Total", m.TickerMessageTotal()),
zap.Any("Second", m.TickerMessageSecond()),
zap.Any("Cost", m.TickerMessageCost()),
zap.Any("DoneAvg", m.TickerMessageDoneAvg()),
zap.Any("QPS", m.TickerMessageQPS()),
zap.Any("TopQPS", m.TickerMessageTopQPS()),
)
log.Info("Monitor.Error",
zap.Any("Total", m.ErrorMessageTotal()),
zap.Any("Second", m.ErrorMessageSecond()),
zap.Any("Cost", m.ErrorMessageCost()),
zap.Any("DoneAvg", m.ErrorMessageDoneAvg()),
zap.Any("QPS", m.ErrorMessageQPS()),
zap.Any("TopQPS", m.ErrorMessageTopQPS()),
)
})
})
srv.RegConnectionOpenedEvent(func(srv *server.Server, conn *server.Conn) {
player := &Player{Player: builtin.NewPlayer[string](conn.GetID(), conn)}
players.Set(conn.GetID(), player)
lockstep.JoinClient(player)
})
srv.RegConnectionClosedEvent(func(srv *server.Server, conn *server.Conn) {
players.Delete(conn.GetID())
lockstep.LeaveClient(conn.GetID())
if players.Size() == 0 {
lockstep.Stop()
}
})
srv.RegConnectionReceiveWebsocketPacketEvent(func(srv *server.Server, conn *server.Conn, packet []byte, messageType int) {
switch string(packet) {
case "start":
lockstep.StartBroadcast()
default:
time.Sleep(random.Duration(1, 3) * time.Second)
lockstep.AddCommand(&Command{CMD: 1, Data: string(packet)})
}
})
if err := srv.Run(":9999"); err != nil {
panic(err)
}
}

View File

@ -19,7 +19,6 @@ var (
ErrPleaseUseWebsocketHandle = errors.New("in Websocket mode, please use the RegConnectionReceiveWebsocketPacketEvent function to register") ErrPleaseUseWebsocketHandle = errors.New("in Websocket mode, please use the RegConnectionReceiveWebsocketPacketEvent function to register")
ErrPleaseUseOrdinaryPacketHandle = errors.New("non Websocket mode, please use the RegConnectionReceivePacketEvent function to register") ErrPleaseUseOrdinaryPacketHandle = errors.New("non Websocket mode, please use the RegConnectionReceivePacketEvent function to register")
ErrNoSupportCross = errors.New("the server does not support GetID or PushCrossMessage, please use the WithCross option to create the server") ErrNoSupportCross = errors.New("the server does not support GetID or PushCrossMessage, please use the WithCross option to create the server")
ErrNoSupportMonitor = errors.New("the server does not support GetMonitor, please use the WithMonitor option to create the server")
ErrNoSupportTicker = errors.New("the server does not support Ticker, please use the WithTicker option to create the server") ErrNoSupportTicker = errors.New("the server does not support Ticker, please use the WithTicker option to create the server")
ErrUnregisteredCrossName = errors.New("unregistered cross name, please use the WithCross option to create the server") ErrUnregisteredCrossName = errors.New("unregistered cross name, please use the WithCross option to create the server")
) )

View File

@ -1,341 +0,0 @@
package server
import (
"github.com/kercylan98/minotaur/utils/timer"
"sync"
"time"
)
func newMonitor() *monitor {
m := &monitor{
ticker: timer.GetTicker(10),
}
m.ticker.Loop("tick", timer.Instantly, time.Second, timer.Forever, m.tick)
return m
}
type Monitor interface {
MessageTotal() int64
PacketMessageTotal() int64
ErrorMessageTotal() int64
CrossMessageTotal() int64
TickerMessageTotal() int64
MessageSecond() int64
PacketMessageSecond() int64
ErrorMessageSecond() int64
CrossMessageSecond() int64
TickerMessageSecond() int64
MessageCost() time.Duration
PacketMessageCost() time.Duration
ErrorMessageCost() time.Duration
CrossMessageCost() time.Duration
TickerMessageCost() time.Duration
MessageDoneAvg() time.Duration
PacketMessageDoneAvg() time.Duration
ErrorMessageDoneAvg() time.Duration
CrossMessageDoneAvg() time.Duration
TickerMessageDoneAvg() time.Duration
MessageQPS() int64
PacketMessageQPS() int64
ErrorMessageQPS() int64
CrossMessageQPS() int64
TickerMessageQPS() int64
MessageTopQPS() int64
PacketMessageTopQPS() int64
ErrorMessageTopQPS() int64
CrossMessageTopQPS() int64
TickerMessageTopQPS() int64
}
type monitor struct {
rwMutex sync.RWMutex
ticker *timer.Ticker
messageTotal int64 // 正在执行的消息总数
packetMessageTotal int64 // 正在执行的玩家消息总数
errorMessageTotal int64 // 正在执行的错误消息总数
crossMessageTotal int64 // 正在执行的跨服消息总数
tickerMessageTotal int64 // 正在执行的定时器消息总数
messageSecond int64 // 一秒内执行的消息并发量
packetMessageSecond int64 // 一秒内玩家消息并发量
errorMessageSecond int64 // 一秒内错误消息并发量
crossMessageSecond int64 // 一秒内跨服消息并发量
tickerMessageSecond int64 // 一秒内定时器消息并发量
messageCost time.Duration // 一秒内执行的消息总耗时
packetMessageCost time.Duration // 一秒内玩家消息总耗时
errorMessageCost time.Duration // 一秒内错误消息总耗时
crossMessageCost time.Duration // 一秒内跨服消息总耗时
tickerMessageCost time.Duration // 一秒内定时器消息总耗时
messageDoneAvg time.Duration // 一秒内执行的消息平均响应时间
packetMessageDoneAvg time.Duration // 一秒内玩家消息平均响应时间
errorMessageDoneAvg time.Duration // 一秒内错误消息平均响应时间
crossMessageDoneAvg time.Duration // 一秒内跨服消息平均响应时间
tickerMessageDoneAvg time.Duration // 一秒内定时器消息平均响应时间
messageQPS int64 // 一秒内执行的消息QPS
packetMessageQPS int64 // 一秒内玩家消息QPS
errorMessageQPS int64 // 一秒内错误消息QPS
crossMessageQPS int64 // 一秒内跨服消息QPS
tickerMessageQPS int64 // 一秒内定时器消息QPS
messageTopQPS int64 // 执行的消息最高QPS
packetMessageTopQPS int64 // 玩家消息最高QPS
errorMessageTopQPS int64 // 错误消息最高QPS
crossMessageTopQPS int64 // 跨服消息最高QPS
tickerMessageTopQPS int64 // 定时器消息最高QPS
}
func (slf *monitor) tick() {
slf.rwMutex.Lock()
// 秒平均响应时间
if slf.messageSecond == 0 {
slf.messageDoneAvg = 0
} else {
slf.messageDoneAvg = time.Duration(slf.messageCost.Nanoseconds() / slf.messageSecond)
}
if slf.packetMessageSecond == 0 {
slf.packetMessageDoneAvg = 0
} else {
slf.packetMessageDoneAvg = time.Duration(slf.packetMessageCost.Nanoseconds() / slf.packetMessageSecond)
}
if slf.errorMessageSecond == 0 {
slf.errorMessageDoneAvg = 0
} else {
slf.errorMessageDoneAvg = time.Duration(slf.errorMessageCost.Nanoseconds() / slf.errorMessageSecond)
}
if slf.crossMessageSecond == 0 {
slf.crossMessageDoneAvg = 0
} else {
slf.crossMessageDoneAvg = time.Duration(slf.crossMessageCost.Nanoseconds() / slf.crossMessageSecond)
}
if slf.tickerMessageSecond == 0 {
slf.tickerMessageDoneAvg = 0
} else {
slf.tickerMessageDoneAvg = time.Duration(slf.tickerMessageCost.Nanoseconds() / slf.tickerMessageSecond)
}
// 秒 QPS
if nanoseconds := slf.messageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.messageQPS = 0
} else {
slf.messageQPS = slf.messageSecond / nanoseconds
}
if nanoseconds := slf.packetMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.packetMessageQPS = 0
} else {
slf.packetMessageQPS = slf.packetMessageSecond / nanoseconds
}
if nanoseconds := slf.errorMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.errorMessageQPS = 0
} else {
slf.errorMessageQPS = slf.errorMessageSecond / nanoseconds
}
if nanoseconds := slf.crossMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.crossMessageQPS = 0
} else {
slf.crossMessageQPS = slf.crossMessageSecond / nanoseconds
}
if nanoseconds := slf.tickerMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.tickerMessageQPS = 0
} else {
slf.tickerMessageQPS = slf.tickerMessageSecond / nanoseconds
}
// Top QPS
if slf.messageQPS > slf.messageTopQPS {
slf.messageTopQPS = slf.messageQPS
}
if slf.packetMessageQPS > slf.packetMessageTopQPS {
slf.packetMessageTopQPS = slf.packetMessageQPS
}
if slf.errorMessageQPS > slf.errorMessageTopQPS {
slf.errorMessageTopQPS = slf.errorMessageQPS
}
if slf.crossMessageQPS > slf.crossMessageTopQPS {
slf.crossMessageTopQPS = slf.crossMessageQPS
}
if slf.tickerMessageQPS > slf.tickerMessageTopQPS {
slf.tickerMessageTopQPS = slf.tickerMessageQPS
}
slf.messageSecond = 0
slf.packetMessageSecond = 0
slf.errorMessageSecond = 0
slf.crossMessageSecond = 0
slf.tickerMessageSecond = 0
slf.messageCost = 0
slf.packetMessageCost = 0
slf.errorMessageCost = 0
slf.crossMessageCost = 0
slf.tickerMessageCost = 0
slf.rwMutex.Unlock()
}
func (slf *monitor) messageRun(msg *Message) {
slf.rwMutex.Lock()
defer slf.rwMutex.Unlock()
switch msg.t {
case MessageTypePacket:
slf.packetMessageTotal++
slf.packetMessageSecond++
case MessageTypeError:
slf.errorMessageTotal++
slf.errorMessageSecond++
case MessageTypeCross:
slf.crossMessageTotal++
slf.crossMessageSecond++
case MessageTypeTicker:
slf.tickerMessageTotal++
slf.tickerMessageSecond++
default:
return
}
slf.messageTotal++
slf.messageSecond++
}
func (slf *monitor) messageDone(msg *Message, cost time.Duration) {
slf.rwMutex.Lock()
defer slf.rwMutex.Unlock()
switch msg.t {
case MessageTypePacket:
slf.packetMessageTotal--
slf.packetMessageCost += cost
case MessageTypeError:
slf.errorMessageTotal--
slf.errorMessageCost += cost
case MessageTypeCross:
slf.crossMessageTotal--
slf.crossMessageCost += cost
case MessageTypeTicker:
slf.tickerMessageTotal--
slf.tickerMessageCost += cost
default:
return
}
slf.messageTotal--
slf.messageCost += cost
}
func (slf *monitor) close() {
slf.ticker.Release()
}
func (slf *monitor) MessageTotal() int64 {
return slf.messageTotal
}
func (slf *monitor) PacketMessageTotal() int64 {
return slf.packetMessageTotal
}
func (slf *monitor) ErrorMessageTotal() int64 {
return slf.errorMessageTotal
}
func (slf *monitor) CrossMessageTotal() int64 {
return slf.crossMessageTotal
}
func (slf *monitor) TickerMessageTotal() int64 {
return slf.tickerMessageTotal
}
func (slf *monitor) MessageSecond() int64 {
return slf.messageSecond
}
func (slf *monitor) PacketMessageSecond() int64 {
return slf.packetMessageSecond
}
func (slf *monitor) ErrorMessageSecond() int64 {
return slf.errorMessageSecond
}
func (slf *monitor) CrossMessageSecond() int64 {
return slf.crossMessageSecond
}
func (slf *monitor) TickerMessageSecond() int64 {
return slf.tickerMessageSecond
}
func (slf *monitor) MessageCost() time.Duration {
return slf.messageCost
}
func (slf *monitor) PacketMessageCost() time.Duration {
return slf.packetMessageCost
}
func (slf *monitor) ErrorMessageCost() time.Duration {
return slf.errorMessageCost
}
func (slf *monitor) CrossMessageCost() time.Duration {
return slf.crossMessageCost
}
func (slf *monitor) TickerMessageCost() time.Duration {
return slf.tickerMessageCost
}
func (slf *monitor) MessageDoneAvg() time.Duration {
return slf.messageDoneAvg
}
func (slf *monitor) PacketMessageDoneAvg() time.Duration {
return slf.packetMessageDoneAvg
}
func (slf *monitor) ErrorMessageDoneAvg() time.Duration {
return slf.errorMessageDoneAvg
}
func (slf *monitor) CrossMessageDoneAvg() time.Duration {
return slf.crossMessageDoneAvg
}
func (slf *monitor) TickerMessageDoneAvg() time.Duration {
return slf.tickerMessageDoneAvg
}
func (slf *monitor) MessageQPS() int64 {
return slf.messageQPS
}
func (slf *monitor) PacketMessageQPS() int64 {
return slf.packetMessageQPS
}
func (slf *monitor) ErrorMessageQPS() int64 {
return slf.errorMessageQPS
}
func (slf *monitor) CrossMessageQPS() int64 {
return slf.crossMessageQPS
}
func (slf *monitor) TickerMessageQPS() int64 {
return slf.tickerMessageQPS
}
func (slf *monitor) MessageTopQPS() int64 {
return slf.messageTopQPS
}
func (slf *monitor) PacketMessageTopQPS() int64 {
return slf.packetMessageTopQPS
}
func (slf *monitor) ErrorMessageTopQPS() int64 {
return slf.errorMessageTopQPS
}
func (slf *monitor) CrossMessageTopQPS() int64 {
return slf.crossMessageTopQPS
}
func (slf *monitor) TickerMessageTopQPS() int64 {
return slf.tickerMessageTopQPS
}

View File

@ -23,16 +23,6 @@ const (
type Option func(srv *Server) type Option func(srv *Server)
// WithMonitor 通过监控的方式创建服务器
// - 需要注意在消息被转为异步处理时会导致部分指标不可信
func WithMonitor() Option {
return func(srv *Server) {
if srv.monitor == nil {
srv.monitor = newMonitor()
}
}
}
// WithTicker 通过定时器创建服务器,为服务器添加定时器功能 // WithTicker 通过定时器创建服务器,为服务器添加定时器功能
// - autonomy定时器是否独立运行独立运行的情况下不会作为服务器消息运行会导致并发问题 // - autonomy定时器是否独立运行独立运行的情况下不会作为服务器消息运行会导致并发问题
// - 多核与分流情况下需要考虑是否有必要 autonomy // - 多核与分流情况下需要考虑是否有必要 autonomy

View File

@ -52,7 +52,6 @@ func New(network Network, options ...Option) *Server {
// Server 网络服务器 // Server 网络服务器
type Server struct { type Server struct {
*event // 事件 *event // 事件
monitor *monitor // 监控
cross map[string]Cross // 跨服 cross map[string]Cross // 跨服
id int64 // 服务器id id int64 // 服务器id
network Network // 网络类型 network Network // 网络类型
@ -333,14 +332,6 @@ func (slf *Server) Ticker() *timer.Ticker {
return slf.ticker return slf.ticker
} }
// GetMonitor 获取服务器监控信息
func (slf *Server) GetMonitor() Monitor {
if slf.monitor == nil {
panic(ErrNoSupportMonitor)
}
return slf.monitor
}
// Shutdown 停止运行服务器 // Shutdown 停止运行服务器
func (slf *Server) Shutdown(err error, stack ...string) { func (slf *Server) Shutdown(err error, stack ...string) {
slf.isShutdown.Store(true) slf.isShutdown.Store(true)
@ -374,10 +365,6 @@ func (slf *Server) Shutdown(err error, stack ...string) {
log.Error("Server", zap.Error(shutdownErr)) log.Error("Server", zap.Error(shutdownErr))
} }
} }
if slf.monitor != nil {
slf.monitor.close()
slf.monitor = nil
}
if err != nil { if err != nil {
var s string var s string
@ -452,15 +439,9 @@ func (slf *Server) dispatchMessage(msg *Message) {
} }
if !slf.isShutdown.Load() { if !slf.isShutdown.Load() {
if slf.monitor != nil {
slf.monitor.messageDone(msg, cost)
}
slf.messagePool.Release(msg) slf.messagePool.Release(msg)
} }
}() }()
if slf.monitor != nil {
slf.monitor.messageRun(msg)
}
switch msg.t { switch msg.t {
case MessageTypePacket: case MessageTypePacket:
if slf.network == NetworkWebsocket { if slf.network == NetworkWebsocket {