using System.Collections.Concurrent;
namespace WIDESEA_Core.Core
{
///
/// 轮询服务 - 线程安全的地址轮询选择
///
public class RoundRobinService
{
///
/// 轮询计数器 - key: 巷道前缀, value: 当前索引
///
private readonly ConcurrentDictionary _counters = new();
///
/// 获取下一个地址(轮询)
///
/// 巷道前缀标识
/// 候选地址列表
/// 选中的目标地址
public string GetNextAddress(string key, List 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];
}
}
}