클러스터 서버 정보 수집 및 할당 서비스 Beetle.Tracker

Beetle Tracker의 디자인 목적은 서버 자원 수집과 분배에 사용되는 응용 서비스 플랫폼이다. Beetle Tracker를 통해 서로 다른 응용 서버의 상태 정보 수집을 제정하고 응용 요청에 따라 조작에 가장 적합한 서버 자원 정보를 분배할 수 있다.개발자는 자신의 수요에 따라 서비스 자원 수집과 분배 규칙을 제정하여 Beetle Tracke 서비스에 마운트하여 간단한 집단 서버 정보 수집과 분배 작업을 할 수 있다.

성능 지표


서비스 설계의 성능 지표는 한 대의 서버가 50K/초의 자원 분배 임무를 맡을 수 있다는 것이다.

확장성


서비스 통신 인터페이스의 방식으로 응용을 마운트하고 응용의 수요에 따라 상응하는 규칙을 실현하고 서비스에 설정하면 사용할 수 있다.사용자 정의 규칙에는 주로 다음과 같은 인터페이스가 있습니다.
  • 정보 정의
    public interface IProperties
    {
        void FromHeaders(IDictionary header);
        IDictionary ToHeaders();
    }

    실현 용례
    public class TestProperties:Beetle.Tracker.Properties
    {
        public string Group
        {
            get
            {
                return this["GROUP"];
            }
            set
            {
                this["GROUP"] = value;
            }
        }
        public string Host
        {
            get
            {
                return this["HOST"];
            }
            set
            {
                this["HOST"] = value;
            }
        }
        public string Port
        {
            get
            {
                return this["PORT"];
            }
            set
            {
                this["PORT"] = value;
            }
        }
        public string Node
        {
            get
            {
                return this["NODE"];
            }
            set
            {
                this["NODE"] = value;
            }
                       
        }
    }

  • 정보 서열화
    public interface IInfoFormater
    {
        object FromString(Type type,string value);
        string ToStringValue(object obj);
    }

    실현 용례
    public interface IAppTrackerHandler
    {
        IInfoFormater Formater
        {
            get;
            set;
        }
        AppHost GetHost(IProperties properties);
         IProperties Register(IProperties properties);
         TrackerInfo GetInfo(IProperties properties);
    }

  • 서버 정보 수집 및 할당
    public interface IAppTrackerHandler
    {
        IInfoFormater Formater
        {
            get;
            set;
        }
        AppHost GetHost(IProperties properties);
         IProperties Register(IProperties properties);
         TrackerInfo GetInfo(IProperties properties);
    }

    실현 용례
    public class TestTackerHandler :MarshalByRefObject, Beetle.Tracker.IAppTrackerHandler
    {
        public TestTackerHandler()
        {
            Formater = new TestFormater();
        }
        private long mCursorIndex = 0;
        private List mGroups = new List();
        public IInfoFormater Formater
        {
            get;
            set;
        }
        public IProperties Register(IProperties properties)
        {
            lock (mGroups)
            {
                TestProperties tp = new TestProperties();
                tp.FromHeaders(properties.ToHeaders());
                Group group = mGroups.Find(e => e.Name == tp.Group);
                if (group == null)
                {
                    group = new Group();
                    group.Name = tp.Group;
                    group.Nodes = new List();
                    group.Nodes.Add(new Node { Name = tp.Node, Host = tp.Host, Port = tp.Port, LastTrackTime=DateTime.Now });
                    mGroups.Add(group);
                }
                else
                {
                    Node node = group.Nodes.Find(n =>  n.Name== tp.Node );
                    if(node !=null)
                        node.LastTrackTime = DateTime.Now;
                    else
                        group.Nodes.Add(new Node { Name = tp.Node, Host = tp.Host, Port = tp.Port, LastTrackTime = DateTime.Now });
                }
                return new Properties();
            }
        }
        public TrackerInfo GetInfo(IProperties properties)
        {
            TrackerInfo result = new TrackerInfo();
            result.TypeName = "Beetle.Tracker.TestImpl.Group,Beetle.Tracker.TestImpl";
            TestProperties tp = new TestProperties();
            tp.FromHeaders(properties.ToHeaders());
            Group group = mGroups.Find(e => e.Name == tp.Group);
            if (group == null)
                return null;
            result.Data= Formater.ToStringValue(group);
            return result;
        }
        public override object InitializeLifetimeService()
        {
            return null;
        }
        public AppHost GetHost(IProperties properties)
        {
            int g = 0;
            while (g < mGroups.Count)
            {
                int i = 0;
                Group group = mGroups[(int)(mCursorIndex % mGroups.Count)];
                mCursorIndex++;
                while (i < group.Nodes.Count)
                {
                    Node node = group.Nodes[(int)(group.CursorIndex % group.Nodes.Count)];
                    group.CursorIndex++;
                    if ((DateTime.Now - node.LastTrackTime).TotalSeconds < 5)
                        return new AppHost { Host = node.Host, Port = int.Parse(node.Port) };
                    i++;
                }
                  
                g++;
            }
            return null;
              
        }
    }


  • 성능 테스트 결과


    노트북 한 대를 서버 테스트로 사용합니다. 테스트 결과는 현재 서비스가 초당 2.5W/초의 서버 할당 요청을 불러올 수 있는 처리입니다.

    좋은 웹페이지 즐겨찾기