1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package simple
- import (
- cfacade "github.com/mhaya/facade"
- clog "github.com/mhaya/logger"
- cproto "github.com/mhaya/net/proto"
- )
- var (
- nodeRouteMap = map[uint32]*NodeRoute{}
- onDataRouteFunc = DefaultDataRoute
- )
- type (
- NodeRoute struct {
- NodeType string
- ActorID string
- FuncName string
- }
- DataRouteFunc func(agent *Agent, msg *Message, route *NodeRoute)
- )
- func AddNodeRoute(mid uint32, nodeRoute *NodeRoute) {
- if nodeRoute == nil {
- return
- }
- nodeRouteMap[mid] = nodeRoute
- }
- func GetNodeRoute(mid uint32) (*NodeRoute, bool) {
- routeActor, found := nodeRouteMap[mid]
- return routeActor, found
- }
- func DefaultDataRoute(agent *Agent, msg *Message, route *NodeRoute) {
- session := agent.session
- session.Mid = msg.MID
- // current node
- if agent.NodeType() == route.NodeType {
- targetPath := cfacade.NewChildPath(agent.NodeId(), route.ActorID, session.Sid)
- LocalDataRoute(agent, session, msg, route, targetPath)
- return
- }
- if !session.IsBind() {
- clog.Warnf("[sid = %s,uid = %d] Session is not bind with UID. failed to forward message.[route = %+v]",
- agent.SID(),
- agent.UID(),
- route,
- )
- return
- }
- member, found := agent.Discovery().Random(route.NodeType)
- if !found {
- return
- }
- targetPath := cfacade.NewPath(member.GetNodeId(), route.ActorID)
- ClusterLocalDataRoute(agent, session, msg, route, member.GetNodeId(), targetPath)
- }
- func LocalDataRoute(agent *Agent, session *cproto.Session, msg *Message, nodeRoute *NodeRoute, targetPath string) {
- message := cfacade.GetMessage()
- message.Source = session.AgentPath
- message.Target = targetPath
- message.FuncName = nodeRoute.FuncName
- message.Session = session
- message.Args = msg.Data
- agent.ActorSystem().PostLocal(&message)
- }
- func ClusterLocalDataRoute(agent *Agent, session *cproto.Session, msg *Message, nodeRoute *NodeRoute, nodeID, targetPath string) error {
- clusterPacket := cproto.GetClusterPacket()
- clusterPacket.SourcePath = session.AgentPath
- clusterPacket.TargetPath = targetPath
- clusterPacket.FuncName = nodeRoute.FuncName
- clusterPacket.Session = session // agent session
- clusterPacket.ArgBytes = msg.Data // packet -> message -> data
- return agent.Cluster().PublishLocal(nodeID, clusterPacket)
- }
|