负载均衡轮询逻辑

背景

在有些业务场景中,需要轮流的取出某个集合中的其中一个数据,这个时候就需要一个轮询逻辑,比较优秀的是ribbon+feign中的轮询逻辑,轮流取出服务器列表中的地址。

这里就模仿ribbon的轮询负载做了一个轮询的策略方法

实现

每次使用的时候,就是传入要负载的数据总数,会返回一个本次应该取第几条

java 复制代码
    /**
     * 轮询
     * @param staffNumber 总数
     * @return 应取第几条
     */
    private int getPolling(int staffNumber){
        try {
            Long next = pollingConfig.getNextAndSet();
            long index = next % staffNumber;
            return (int)index;
        }catch (Exception e){
            log.error("轮询策略取用户号码失败,默认取第一个号码", e);
            return 0;
        }

    }

数据次数查询,不断的+1很简单的逻辑

这里的+1和更新逻辑是用redis来做的,毕竟redis的increment的+1操作并且更新是通过lua脚本实现的,是属于原子性的操作,不会出现+1 但是没有更新的情况。

如果自己通过本地内存实现这个+1更新缓存操作的的话,一定要注意线程问题。

java 复制代码
public class PollingConfig {


    @Resource
    private RedisCacheHelper redisCacheHelper;

    private static long MAX = 1000000L;

    /**
     * 计数器,获取下一个数据
     * @return 结果
     */
    public Long getNextAndSet(){
        Long increment = redisCacheHelper.increment(RedisKeyConstants.WHATS_APP_NUMBER_POLLING, 1);
        if (increment > MAX) {
            return incrementZero();
        }
        return increment;
    }

    //这个方法是为了防止数值过大
    public synchronized Long incrementZero(){
        Long increment = redisCacheHelper.increment(RedisKeyConstants.WHATS_APP_NUMBER_POLLING, 1);
        if (increment > MAX) {
            redisCacheHelper.set(RedisKeyConstants.WHATS_APP_NUMBER_POLLING, "1");
            return 1L;
        }
        return increment;
    }

}
相关推荐
tongluowan0073 小时前
Spring MVC 底层工作流程+源码分析
java·spring·mvc
Hexian25804 小时前
SpringAI系列(基础概念&springai系列 API)
spring·ai
Volunteer Technology7 小时前
SpringAI Chat Client (四)
人工智能·spring
ShiJiuD6668889997 小时前
springboot基础篇
java·spring boot·spring
敲敲千反田8 小时前
Spring AI
java·人工智能·spring
拽着尾巴的鱼儿8 小时前
spring 动态代理
java·后端·spring
云烟成雨TD9 小时前
Spring AI Alibaba 1.x 系列【52】Interrupts 中断机制:案例演示
java·人工智能·spring
云烟成雨TD10 小时前
Spring AI Alibaba 1.x 系列【51】Graph 整体运行全流程
java·人工智能·spring
_waylau11 小时前
“Java+AI全栈工程师”问答02:Spring Boot 自动配置原理
java·开发语言·spring boot·后端·spring
Ting-yu11 小时前
SpringCloud快速入门(4)---- nacos安装与使用
java·spring·spring cloud