From fef6bb0cfc7f3b3c25998c56b12c3f02f0b44bf4 Mon Sep 17 00:00:00 2001 From: Seis Date: Sun, 17 Jun 2018 14:19:08 +0800 Subject: [PATCH] dispatcher cluster broadcast --- components/game/GameService.go | 2 +- engine/dispatchercluster/dispatchercluster.go | 46 +++++++------------ engine/proto/GoWorldConnection.go | 30 +++++++++--- 3 files changed, 40 insertions(+), 38 deletions(-) diff --git a/components/game/GameService.go b/components/game/GameService.go index c89f4722..7b4f9b2f 100644 --- a/components/game/GameService.go +++ b/components/game/GameService.go @@ -461,7 +461,7 @@ func (gs *GameService) terminate() { func (gs *GameService) startFreeze() { dispatcherNum := len(config.GetDispatcherIDs()) gs.dispatcherStartFreezeAcks = make([]bool, dispatcherNum) - dispatchercluster.SendStartFreezeGame(gameid) + dispatchercluster.SendStartFreezeGame() } func ConnectedGamesNum() int { diff --git a/engine/dispatchercluster/dispatchercluster.go b/engine/dispatchercluster/dispatchercluster.go index b3509ee1..130563e4 100644 --- a/engine/dispatchercluster/dispatchercluster.go +++ b/engine/dispatchercluster/dispatchercluster.go @@ -55,15 +55,17 @@ func SendMigrateRequest(entityID common.EntityID, spaceID common.EntityID, space func SendRealMigrate(eid common.EntityID, targetGame uint16, data []byte) error { return SelectByEntityID(eid).SendRealMigrate(eid, targetGame, data) } -func SendCallFilterClientProxies(op proto.FilterClientsOpType, key, val string, method string, args []interface{}) (anyerror error) { - // TODO: broadcast one packet instead of sending multiple packets +func SendCallFilterClientProxies(op proto.FilterClientsOpType, key, val string, method string, args []interface{}) { + pkt := proto.AllocCallFilterClientProxiesPacket(op, key, val, method, args) + broadcast(pkt) + pkt.Release() + return +} + +func broadcast(packet *netutil.Packet) { for _, dcm := range dispatcherConns { - err := dcm.GetDispatcherClientForSend().SendCallFilterClientProxies(op, key, val, method, args) - if err != nil && anyerror == nil { - anyerror = err - } + dcm.GetDispatcherClientForSend().SendPacket(packet) } - return } func SendNotifyCreateEntity(id common.EntityID) error { @@ -87,14 +89,10 @@ func SendCreateEntityAnywhere(entityid common.EntityID, typeName string, data ma return SelectByEntityID(entityid).SendCreateEntityAnywhere(entityid, typeName, data) } -func SendStartFreezeGame(gameid uint16) (anyerror error) { - // TODO: broadcast one packet instead of sending multiple packets - for _, dcm := range dispatcherConns { - err := dcm.GetDispatcherClientForSend().SendStartFreezeGame(gameid) - if err != nil { - anyerror = err - } - } +func SendStartFreezeGame() { + pkt := proto.AllocStartFreezeGamePacket() + broadcast(pkt) + pkt.Release() return } @@ -102,23 +100,11 @@ func SendSrvdisRegister(srvid string, info string, force bool) { SelectBySrvID(srvid).SendSrvdisRegister(srvid, info, force) } -func SendCallNilSpaces(exceptGameID uint16, method string, args []interface{}) (anyerror error) { +func SendCallNilSpaces(exceptGameID uint16, method string, args []interface{}) { // construct one packet for multiple sending - packet := netutil.NewPacket() - packet.AppendUint16(proto.MT_CALL_NIL_SPACES) - packet.AppendUint16(exceptGameID) - packet.AppendVarStr(method) - packet.AppendArgs(args) - - for _, dcm := range dispatcherConns { - err := dcm.GetDispatcherClientForSend().SendPacket(packet) - if err != nil { - anyerror = err - } - } - + packet := proto.AllocCallNilSpacesPacket(exceptGameID, method, args) + broadcast(packet) packet.Release() - return } func EntityIDToDispatcherID(entityid common.EntityID) uint16 { diff --git a/engine/proto/GoWorldConnection.go b/engine/proto/GoWorldConnection.go index 9b4417aa..47e4e338 100644 --- a/engine/proto/GoWorldConnection.go +++ b/engine/proto/GoWorldConnection.go @@ -300,15 +300,25 @@ func (gwc *GoWorldConnection) SendClearClientFilterProp(gateid uint16, clientid } // SendCallFilterClientProxies sends MT_CALL_FILTERED_CLIENTS message -func (gwc *GoWorldConnection) SendCallFilterClientProxies(op FilterClientsOpType, key, val string, method string, args []interface{}) (err error) { - packet := gwc.packetConn.NewPacket() +func AllocCallFilterClientProxiesPacket(op FilterClientsOpType, key, val string, method string, args []interface{}) *netutil.Packet { + packet := netutil.NewPacket() packet.AppendUint16(MT_CALL_FILTERED_CLIENTS) packet.AppendByte(byte(op)) packet.AppendVarStr(key) packet.AppendVarStr(val) packet.AppendVarStr(method) packet.AppendArgs(args) - return gwc.SendPacketRelease(packet) + return packet +} + +func AllocCallNilSpacesPacket(exceptGameID uint16, method string, args []interface{}) *netutil.Packet { + // construct one packet for multiple sending + packet := netutil.NewPacket() + packet.AppendUint16(MT_CALL_NIL_SPACES) + packet.AppendUint16(exceptGameID) + packet.AppendVarStr(method) + packet.AppendArgs(args) + return packet } // SendQuerySpaceGameIDForMigrate sends MT_QUERY_SPACE_GAMEID_FOR_MIGRATE message @@ -348,11 +358,17 @@ func (gwc *GoWorldConnection) SendRealMigrate(eid common.EntityID, targetGame ui return gwc.SendPacketRelease(packet) } -// SendStartFreezeGame sends MT_START_FREEZE_GAME message -func (gwc *GoWorldConnection) SendStartFreezeGame(gameid uint16) error { - packet := gwc.packetConn.NewPacket() +//// SendStartFreezeGame sends MT_START_FREEZE_GAME message +//func (gwc *GoWorldConnection) SendStartFreezeGame(gameid uint16) error { +// packet := gwc.packetConn.NewPacket() +// packet.AppendUint16(MT_START_FREEZE_GAME) +// return gwc.SendPacketRelease(packet) +//} + +func AllocStartFreezeGamePacket() *netutil.Packet { + packet := netutil.NewPacket() packet.AppendUint16(MT_START_FREEZE_GAME) - return gwc.SendPacketRelease(packet) + return packet } func MakeNotifyGameConnectedPacket(gameid uint16) *netutil.Packet {