基于百分比分配算法的负载均衡器

时间:2018-08-27 16:24:45

标签: java algorithm rest load-balancing

假设我具有以下实体:

public class Account {
    private String id;
    private List<Host> hosts;
}

public class Host {
    private String name;
    private int percentageLoad;
}

我有一个Web应用程序,其中只有一个端点/check,其中一个accountId作为请求参数。

请求的示例可以是:localhost:8080/check?accountId=123456

该服务必须验证嵌入式数据库中是否存在accountId,如果存在,它将以主机名作为答案。这些主机具有负载百分比,应根据其负载百分比来平衡答案。

这可能会混淆我的解释,所以我举一个例子:

假设我的数据库中有以下Account

Account:
  - id: 123
  - hosts: [{machine1, 60}, {machine2, 40}]

您会看到该帐户的ID为123,并且有两个主机,每个主机的负载百分比为一个。

如果我收到以下请求:localhost:8080/check?accountId=123,则由于该帐户ID存在于数据库中,因此它应根据负载百分比来平衡主机名答案。

更明确地说,假设我发出了10个类似的请求:localhost:8080/check?accountId=123,则主机名machine1应该返回6次(因为它的负载百分比为60%),而{{1} }应该返回4次(因为它的负载百分比为40%)。

我真的不知道该采用哪种策略来平衡它。

我想到了一个计数器,用于计算每台机器的答案数量。或者选择一个介于0到10之间的随机数,然后根据该数字决定一台或多台计算机。但是我认为它们不是好的方法,关于平衡算法的任何想法吗?

1 个答案:

答案 0 :(得分:1)

Host类中需要另一个变量:

public class Host {
    private String name;
    private int percentageLoad;
    private int percentageAccum;
}

percentageAccum的初始值为percentageLoad的值。

收到请求后:

  • 选择拥有最大percentageAccum的主机
  • percentageAccum中减去所选主机的100
  • 为所有主机(包括所选主机)将percentageLoad添加到percentageAccum

略微的优化是在更新所有主机的percentageAccum时确定下一个选择。