负载平衡(Load balancing)是一种电子计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。
常见的负载均衡算法 1.轮询(Round Robin)轮询算法按照顺序将新的请求分配给下一个服务器,最终实现平分请求。
实例:已知服务器: s1 ,s2, s3
请求1 -> s1
请求2-> s2
请求3 -> s3
请求4 -> s1
请求5 -> s2
请求6 -> s3
…
优点:
实现简单,无需记录各种服务的状态,是一种无状态的负载均衡策略。
实现绝对公平
缺点:当各个服务器性能不一致的情况,无法根据服务器性能去分配,无法合理利用服务器资源。
java实现轮询算法:
思路:根据上面的介绍,依次的选择下一个服务器,轮询算法具有周期性的特性,这就是典型的周期性概念,草莓视频在线观看APP第一想法应该就是取余了。
这里推荐大家《程序员的数学1》里面介绍了一些数学和编程思维的一些草莓视频污版免费,其中就有介绍周期和分组的思想,个人感觉这本书还是不错的,推荐给大家。
public class RoundRobin { @Data public static class Server { private int serverId; private String name; private int weight; public Server(int serverId, String name) { this.serverId = serverId; this.name = name; } public Server(int serverId, String name, int weight) { this.serverId = serverId; this.name = name; this.weight = weight; } } private static AtomicInteger NEXT_SERVER_COUNTER = new AtomicInteger(0); private static int select(int modulo) { for (; ; ) { int current = NEXT_SERVER_COUNTER.get(); int next = (current + 1) % modulo; boolean compareAndSet = NEXT_SERVER_COUNTER.compareAndSet(current, next); if (compareAndSet) { return next; } } } public static Server selectServer(List serverList) { return serverList.get(select(serverList.size())); } public static void main(String[] args) { List serverList = new ArrayList(); serverList.add(new Server(1, "服务器1")); serverList.add(new Server(2, "服务器2")); serverList.add(new Server(3, "服务器3")); for (int i = 0; i