wanshenmean
2026-03-09 ca0a0dffd906162c49c7cefed3846a1bc1b3e6cc
feat: 添加轮询服务类支持多出库口负载均衡
已添加1个文件
42 ■■■■■ 文件已修改
Code/WMS/WIDESEA_WMSServer/WIDESEA_Core/Core/RoundRobinService.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_Core/Core/RoundRobinService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
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];
        }
    }
}