2010-04-21 9 views
7

मुझे एन एंडपॉइंट्स को लोड शेड्यूल करने के लिए राउंड रॉबिन एल्गोरिदम लिखना होगा?एक राउंड रॉबिन एल्गोरिदम के साथ लोड शेड्यूलिंग?

तो सर्वर ए, बी और सी

मैं प्रत्येक अनुरोध मैं के लिए उन के माध्यम से राउंड-रोबिन को सुनिश्चित करना चाहते थे कि अगर मैं कर दिया है। मैं इसे सी # में कैसे करूं?

+1

क्या यह लगातार लोड होगा या आप लोड का वितरण भी चाहते हैं? – Avitus

+0

मुझे लगता है कि 'राउंड रॉबिन' इंगित करता है कि भार को समान रूप से वितरित करने का कोई प्रयास नहीं है। –

उत्तर

18
बस रिकॉर्ड, राउंड रोबिन की परिभाषा के लिए

:

http://en.wikipedia.org/wiki/Round-robin_scheduling

बस एक कतार का उपयोग करें। शीर्ष पर से एक को ले जाएं, इसका इस्तेमाल करें और इसे वापस रखें। यह सुनिश्चित करता है कि सबसे हालिया इस्तेमाल किया जाने वाला हमेशा अंतिम व्यक्ति होगा।

Queue<Server> q = new Queue<Server>(); 

//get the next one up 
Server s = q.DeQueue(); 


//Use s; 


//put s back for later use. 
q.Enqueue(s); 

कतार वर्ग के लिए लिंक:

http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

+0

मैं एक ऐसे व्यक्ति को चुनौती दूंगा जो कहता है कि वह राउंड रॉबिन को लागू करना चाहता था, यह पता लगाने के लिए कि क्या वे वास्तव में राउंड रॉबिन का मतलब रखते हैं। – Tim

+2

यह हर समय सर्वर लोड वितरण में उपयोग किया जाता है। – kemiller2002

+1

इस पैटर्न का उपयोग करते समय, इसे उपयोग करने से पहले सर्वर को तुरंत एनक्यू करना संभव हो सकता है (या अंत में ब्लॉक में एनक्यू डालना)। इस तरह, सर्वर का उपयोग करने के दौरान फेंक दिया गया कोई भी अपवाद संभवतः सर्वर को रोटेशन से पूरी तरह से हटाया नहीं जा सकता है। – bvoyelr

1

अपने समाप्ति-बिंदु में सूची या सरणी के माध्यम से पहुँचा रहे हैं, तो आप केवल एक परिपत्र फैशन में एक सूचकांक बढ़ाने के लिए की जरूरत है:

public class RoundRobinIndex 
{ 
    volatile int index = 0; 
    int count; 

    public int Next 
    { 
     get 
     { 
      if (index == count) 
      { 
       index = 0; 
      } 
      return index++; 
     } 
    } 

    public RoundRobinIndex(int countArg) 
    { 
     count = countArg; 
    } 
} 
+0

इसका उपयोग करने से इंडेक्सऑटऑफेंजेंज अपवाद – IBootstrap

+0

@IBootstrap - यह इंडेक्सऑटऑफेंजेंज अपवाद का कारण नहीं बनता है। क्या आपने वास्तव में इसका परीक्षण किया है? –

+0

अगला का उपयोग करके भी प्राप्त किया जा सकता है: (अनुक्रमणिका + 1)% गिनती; – Aerokneeus

6

ईबॉवर के समान विचार, लेकिन अगले आइटम की अनुक्रमणिका के बजाय अगला आइटम क्या है पर ध्यान केंद्रित करना।

public class RoundRobinList<T> 
{ 
    private readonly IList<T> _list; 
    private readonly int _size; 
    private int _position; 

    public RoundRobinList(IList<T> list) 
    { 
     if (!list.Any()) 
      throw new NullReferenceException("list"); 

     _list = new List<T>(list); 
     _size = _list.Count;    
    } 

    public T Next() 
    { 
     if (_size == 1) 
      return _list[0]; 

     Interlocked.Increment(ref _position); 
     var mod = _position % _size; 
     return _list[mod]; 
    } 
} 
+0

_position बढ़ाने से पहले IENumerable को कन्स्ट्रक्टर और रिकॉर्ड मोड में पास करें, और यह धन है। – JJS

संबंधित मुद्दे