负载均衡算法--轮询法(Round Robin)

在分布式系统中,为了实现系统的高性能、高并发、高可用,在构架中都会进行负载均衡设计,它是分布式系统的核心和中枢,负载均衡的好坏直接影响着整个系统的性能。负载均衡分为软件均衡和硬件均衡两类,比如apache、nginx、dubbo 等属于软件负载均衡,F5属于硬件负载均衡,当然他们都会使用到负载均衡算法。

常见的负载均衡算法包含:
1、轮询法(Round Robin)
2、加权轮询法(Weight Round Robin)
3、随机法(Random)
4、加权随机法(Weight Random)
5、平滑加权轮询法(Smooth Weight Round Robin)
6、源地址哈希法(Hash)
7、最小连接数法(Least Connections)

接下来的博客中会一一介绍如上几种算法,本文介绍轮询法。

轮询法是将请求按顺序轮流地分配到服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

算法描述

假设有 N 台服务器 S = {S0, S1, S2, …, Sn},算法可以描述为:
1、从 S0 开始依次调度 S1, S2, …, Sn;
2、若所有服务器都已被调度过,则从头开始调度;

假定我们现在有如下四台服务器:

服务器地址权重
192.168.1.11
192.168.1.22
192.168.1.33
192.168.1.44

轮训算法调度如下:

服务器地址序号
192.168.1.11
192.168.1.22
192.168.1.33
192.168.1.44
192.168.1.15
192.168.1.26
192.168.1.37
192.168.1.48

轮训算法与服务器权重没有关系,每个服务器有序的会被轮训到。

代码实现

1、服务器管理类

package org.learn.loadbalance;

import java.util.Map;
import java.util.TreeMap;

/**
 * @author zhibo
 * @date 2019/5/16 16:25
 */
public class ServerManager {
    public static Map<String, Integer> serverMap = new TreeMap<>();

    static {
        serverMap.put("192.168.1.1", 1);
        serverMap.put("192.168.1.2", 2);
        serverMap.put("192.168.1.3", 3);
        serverMap.put("192.168.1.4", 4);
    }
}

2、轮询类

package org.learn.loadbalance;

import java.util.ArrayList;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author zhibo
 * @date 2019/5/16 16:28
 */
public class RoundRobin {
    private static AtomicInteger indexAtomic = new AtomicInteger(0);

    public static String getServer() {
        Set<String> serverSet = ServerManager.serverMap.keySet();
        ArrayList<String> serverList = new ArrayList<>(serverSet);

        if (indexAtomic.get() >= serverList.size()) {
            indexAtomic.set(0);
        }
        String server = serverList.get(indexAtomic.getAndIncrement());
        return server;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            String server = getServer();
            System.out.println(server);
        }
    }
}

1、使用 AtomicInteger 进行轮询索引的增减,保证并发的安全性。
2、在多线程的情况下, 线程A修改 ServerManager.serverMap 的值,线程B无法即时拿到线程A修改后的值,因此可能会产生请求错误,需要调用端进行容错处理。

执行 main 方法输出结果如下:
在这里插入图片描述
文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

四层和七层负载均衡算法负载均衡器用于决策流量分发的两种常见算法。它们的区别在于负载均衡的粒度和侧重点。 1. 四层负载均衡算法(Layer 4 Load Balancing):四层负载均衡算法基于传输层(Transport Layer)的信息进行流量分发。常见的四层协议是TCP和UDP。四层负载均衡器根据源IP、目标IP、源端口、目标端口等信息来做出决策。常见的四层负载均衡算法包括: - 轮询Round Robin):按照顺序将请求分发给每个后端服务器,循环往复。 - 加权轮询(Weighted Round Robin):根据后端服务器的权重分配请求,权重高的服务器获取到的请求数更多。 - 最少连接(Least Connections):将请求发送到当前连接数最少的后端服务器,以实现负载均衡。 - IP散列(IP Hashing):根据客户端IP地址进行散列计算,将同一客户端的请求分发到同一台后端服务器。 2. 七层负载均衡算法(Layer 7 Load Balancing):七层负载均衡算法基于应用层(Application Layer)的信息进行流量分发。它不仅考虑传输层的信息,还深入解析应用层的请求报文,以便更精细地决策流量分发。常见的七层负载均衡算法包括: - 轮询Round Robin) - 加权轮询(Weighted Round Robin) - 最少连接(Least Connections) - URL散列(URL Hashing):根据请求的URL进行散列计算,将相同URL的请求分发到同一台后端服务器。 - Cookie(Cookie-based):根据请求中的Cookie信息来决定流量分发。 - SSL会话(SSL Session):根据SSL会话信息来决定流量分发。 七层负载均衡算法相比于四层负载均衡算法,具有更高的灵活性和精细度,因为它可以基于应用层的信息做出决策。然而,七层负载均衡器的性能开销相对较大,适用于对请求处理要求较高的场景。四层负载均衡算法则更加轻量和高效,适用于大规模流量分发的场景。选择使用哪种负载均衡算法应根据具体的业务需求和系统特点做出权衡。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值