n個のエンドポイントへのロードをスケジュールするためにラウンドロビンアルゴリズムを作成する必要がありますか?
したがって、サーバーA、B、Cがある場合
リクエストごとに、必ずラウンドロビンを実行したかったのです。C#でこれを行うにはどうすればよいですか?
n個のエンドポイントへのロードをスケジュールするためにラウンドロビンアルゴリズムを作成する必要がありますか?
したがって、サーバーA、B、Cがある場合
リクエストごとに、必ずラウンドロビンを実行したかったのです。C#でこれを行うにはどうすればよいですか?
記録のために、ラウンドロビンの定義:
http://en.wikipedia.org/wiki/Round-robin_scheduling
キューを使用するだけです。上部の 1 つを取り外して使用し、元に戻します。これにより、最後に使用されたものが常に最後に取得されるようになります。
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);
キュー クラスへのリンク:
ebpower と同じ考え方ですが、次のアイテムのインデックスではなく、次のアイテムに焦点を当てています。
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];
}
}
リストまたは配列を介してエンドポイントにアクセスする場合は、循環方式でインデックスをインクリメントするだけで済みます。
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;
}
}