/// <summary> /// 转发消息到从节点 /// </summary> /// <param name="slaveNode"></param> /// <param name="soaMsg"></param> /// <returns></returns> private IDataContainer TransferMsgToSlave(PeekerClusterNode slaveNode, SoapMessage soaMsg) { IDataContainer result = null; try { //string address = "127.0.0.1"; using (var conn = new SoapTcpConnection(slaveNode.IpAddress, slaveNode.Port)) { if (conn.State == ConnectionState.Closed) { conn.Open(); } //发送soap result = conn.SendSoapMessage(soaMsg); } } catch (Exception ex) { Logger.Error(ex); } return(result); }
/// <summary> /// 注册从节点端口,并返回可用的端口 /// </summary> /// <param name="slaveIdentity"></param> public static int AddSlavePort(string slaveIdentity) { lock (_LockObj) { int port = -1; ///不得超过最大从节点阈值 if (_slaveNodes.Count < MaxSlaveNodeCount) { if (_slaveNodes.Count > 0) { port = _slaveNodes .Max(x => x.Port) + 1; } else { port = GlobalContext.MasterSocketPort + 1; } int counuter = 1; while (counuter <= 10) { bool isBeUsed = SocketHelper.IsUsedIPEndPoint(port); if (isBeUsed == false) { break;//一旦发现合适端口 那么返回 } else { port = port + counuter; } counuter++; } var node = new PeekerClusterNode(slaveIdentity) { IpAddress = "127.0.0.1", Port = port, AddDateTime = DateTime.Now }; node.BeginSelfHelthCheck(OnHelthCheckFaildHandler); _slaveNodes.Add(node); } return(port); } }
public override IDataContainer ProcessMessage(int SCBID, EndPoint RemoteIPEndPoint, NTCPMessage.MessageFlag Flag, ushort CableId, uint Channel, uint Event, SoapMessage objMsg) { if (null == objMsg) { return(DataContainer.CreateNullDataContainer()); } IDataContainer result = null; try { //如果不是集群,那么主节点处理消息 PeekerClusterNode slaveNode = null; var cmdHead = objMsg.Head; if (false == GlobalContext.IsConfigClusteringMode ||//是否开启集群模式 cmdHead.Equals(CommandConstants.CMD_RegisterSlavePort) ||//注册从节点端口 MasterRemoteServer.GetOneSlavePort(out slaveNode) == false ||//是否注册从节点端口)//注册从节点端口 slaveNode.Port == GlobalContext.MasterSocketPort //分配到了主节点工作 ) { result = base.ProcessMessage(SCBID, RemoteIPEndPoint, Flag, CableId, Channel, Event, objMsg); } else { //转发到从节点 result = this.TransferMsgToSlave(slaveNode, objMsg); } if (null != slaveNode) { slaveNode.ConnectedCount -= 1;//设置连接 减量 } } catch (Exception ex) { Logger.Error(ex); } return(result); }
/// <summary> /// 获取一个可用的节点端口 /// </summary> public static bool GetOneSlavePort(out PeekerClusterNode slaveNode) { bool valid = false; //1 随机数; // 2轮询;(todo) // 3压力综合 slaveNode = null; //随机数 //var randomObj = new Random(DateTime.Now.Millisecond); //int pos1 = randomObj.Next(0, _slaveNodes.Count - 1); //int pos2 = randomObj.Next(0, _slaveNodes.Count - 1); //int pos_final = Math.Max(pos1, pos2); //slaveNode = _slaveNodes.ElementAt(pos_final); //压力综合 slaveNode = _slaveNodes.OrderBy(x => x.ConnectedCount).First(); slaveNode.ConnectedCount += 1;//设置连接增量 valid = true; return(valid); }