Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
 /// <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);
     }
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        /// <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);
        }