采用缓冲池处理服务器消息
This commit is contained in:
parent
a7626965c0
commit
b743d299b3
|
@ -40,10 +40,11 @@ type Server struct {
|
||||||
*event
|
*event
|
||||||
network Network // 网络类型
|
network Network // 网络类型
|
||||||
addr string // 侦听地址
|
addr string // 侦听地址
|
||||||
connections *synchronization.Map[string, *Conn]
|
connections *synchronization.Map[string, *Conn] // 所有在线的连接
|
||||||
httpServer *gin.Engine // HTTP模式下的服务器
|
httpServer *gin.Engine // HTTP模式下的服务器
|
||||||
grpcServer *grpc.Server // GRPC模式下的服务器
|
grpcServer *grpc.Server // GRPC模式下的服务器
|
||||||
gServer *gNet // TCP或UDP模式下的服务器
|
gServer *gNet // TCP或UDP模式下的服务器
|
||||||
|
messagePool *synchronization.Pool[*message] // 消息池
|
||||||
messageChannel chan *message // 消息管道
|
messageChannel chan *message // 消息管道
|
||||||
initMessageChannel bool // 消息管道是否已经初始化
|
initMessageChannel bool // 消息管道是否已经初始化
|
||||||
multiple bool // 是否为多服务器模式下运行
|
multiple bool // 是否为多服务器模式下运行
|
||||||
|
@ -72,6 +73,14 @@ func (slf *Server) Run(addr string) error {
|
||||||
var connectionInitHandle = func(callback func()) {
|
var connectionInitHandle = func(callback func()) {
|
||||||
slf.connections = synchronization.NewMap[string, *Conn]()
|
slf.connections = synchronization.NewMap[string, *Conn]()
|
||||||
slf.initMessageChannel = true
|
slf.initMessageChannel = true
|
||||||
|
slf.messagePool = synchronization.NewPool[*message](1024,
|
||||||
|
func() *message {
|
||||||
|
return &message{}
|
||||||
|
}, func(data *message) {
|
||||||
|
data.t = 0
|
||||||
|
data.attrs = nil
|
||||||
|
},
|
||||||
|
)
|
||||||
slf.messageChannel = make(chan *message, 4096*1000)
|
slf.messageChannel = make(chan *message, 4096*1000)
|
||||||
if slf.network != NetworkHttp && slf.network != NetworkWebsocket {
|
if slf.network != NetworkHttp && slf.network != NetworkWebsocket {
|
||||||
slf.gServer = &gNet{Server: slf}
|
slf.gServer = &gNet{Server: slf}
|
||||||
|
@ -272,15 +281,16 @@ func (slf *Server) HttpRouter() gin.IRouter {
|
||||||
|
|
||||||
// PushMessage 向服务器中写入特定类型的消息,需严格遵守消息属性要求
|
// PushMessage 向服务器中写入特定类型的消息,需严格遵守消息属性要求
|
||||||
func (slf *Server) PushMessage(messageType MessageType, attrs ...any) {
|
func (slf *Server) PushMessage(messageType MessageType, attrs ...any) {
|
||||||
slf.messageChannel <- &message{
|
msg := slf.messagePool.Get()
|
||||||
t: messageType,
|
msg.t = messageType
|
||||||
attrs: attrs,
|
msg.attrs = attrs
|
||||||
}
|
slf.messageChannel <- msg
|
||||||
}
|
}
|
||||||
|
|
||||||
// dispatchMessage 消息分发
|
// dispatchMessage 消息分发
|
||||||
func (slf *Server) dispatchMessage(msg *message) {
|
func (slf *Server) dispatchMessage(msg *message) {
|
||||||
defer func() {
|
defer func() {
|
||||||
|
slf.messagePool.Release(msg)
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
log.Error("Server", zap.Any("error", err))
|
log.Error("Server", zap.Any("error", err))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue