轮询(Round-Robin)
思路很简单,维护一个循环队列即可.
加权轮询
根据配置文件中设置的权重进行分配。
相比轮询,比较更能充分调度不同性能的服务器之间的负载
实现思路:
轮盘赌的思想。通过将权重累加,然后运用之后只需要通过随机数摇号即可。
假设已经设置了权重如下:
A: 10, B: 1, C = 2
那么我们可以这样累计分值:
A(10), B(10 + 1), C(10 + 1 + 2), 即 A(10), B(11), C(12)
后面,只需要生成一个介于0~12的随机数,然后逐个对比即可。好比如,当前随机数9,9
≤
\le
≤ 10, 那么我们将请求分发到服务节点A。
当然这个比对的过程,也可以使用二分查找优化或者红黑树
最少连接数优先
在服务节点性能相当的情况下,还不如选择轮询来得简单高效
最短响应时间优先
实现思路:
通过发送一个简单的请求到所有服务节点,最先响应的服务节点将被分配请求。
响应时间快的服务节点,当前负载理理所当然是最低的。但是** 每一次都发送包到所有节点?性能的损耗 ? **
根据IP地址进行哈希
类似于SO_REUSEPORT,通过对客户端IP地址进行哈希,根据哈希结果分配到不同的服务节点。
涉及长连接和短连接的情况下,这种策略并不能很好地实现负载均衡,而且选择一个哈希算法也比较困难。