using System.Collections.Concurrent;
|
|
namespace WIDESEA_Core.Core
|
{
|
/// <summary>
|
/// 轮询服务 - 线程安全的地址轮询选择
|
/// </summary>
|
public class RoundRobinService
|
{
|
/// <summary>
|
/// 轮询计数器 - key: 巷道前缀, value: 当前索引
|
/// </summary>
|
private readonly ConcurrentDictionary<string, int> _counters = new();
|
|
/// <summary>
|
/// 获取下一个地址(轮询)
|
/// </summary>
|
/// <param name="key">巷道前缀标识</param>
|
/// <param name="addresses">候选地址列表</param>
|
/// <returns>选中的目标地址</returns>
|
public string GetNextAddress(string key, List<string> addresses)
|
{
|
// 空列表检查
|
if (addresses == null || addresses.Count == 0)
|
return "10080";
|
|
// 单个地址,直接返回
|
if (addresses.Count == 1)
|
return addresses[0];
|
|
// 多个地址,使用轮询选择
|
// AddOrUpdate 是原子操作,线程安全
|
int index = _counters.AddOrUpdate(
|
key,
|
0, // 首次使用,从 0 开始
|
(k, oldValue) => (oldValue + 1) % addresses.Count // 轮询:递增后取模
|
);
|
|
return addresses[index];
|
}
|
}
|
}
|