You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.6 KiB
C#
50 lines
1.6 KiB
C#
using System;
|
|
using System.Linq;
|
|
|
|
namespace POSV.LoadBalance
|
|
{
|
|
/// <summary>
|
|
/// Consistent Hash Select
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
public class ConsistentHashRouting<T> : Routing<T>
|
|
{
|
|
private Tuple<T[], ConsistentHash<T>> _cacheConsistentHashTuple;
|
|
private readonly int _vnodes;
|
|
|
|
public ConsistentHashRouting()
|
|
: this(0)
|
|
{ }
|
|
|
|
public ConsistentHashRouting(int virtualNodesFactor)
|
|
{
|
|
_vnodes = virtualNodesFactor < 1 ? LoadBalanceConstants.DefaultVirtualNodesFactor : virtualNodesFactor;
|
|
}
|
|
|
|
protected override T selectInternal(object message, T[] instances)
|
|
{
|
|
if (message == null)
|
|
return default(T);
|
|
|
|
string messageHash = message.GetHashCode().ToString();
|
|
var consistentHashCircle = getInstanceConsistentHashCircle(instances);
|
|
|
|
return consistentHashCircle.NodeFor(messageHash);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create instance Consistent Hash Circle, if instance no change will direct read the cache
|
|
/// </summary>
|
|
/// <param name="instances"></param>
|
|
/// <returns></returns>
|
|
private ConsistentHash<T> getInstanceConsistentHashCircle(T[] instances)
|
|
{
|
|
if (_cacheConsistentHashTuple == null || !_cacheConsistentHashTuple.Item1.SequenceEqual(instances))
|
|
{
|
|
_cacheConsistentHashTuple = new Tuple<T[], ConsistentHash<T>>(instances, ConsistentHash.Create<T>(instances, _vnodes));
|
|
}
|
|
return _cacheConsistentHashTuple.Item2;
|
|
}
|
|
}
|
|
}
|