| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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]; |
| | | } |
| | | } |
| | | } |