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

4

假设我有以下实体:

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

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

我有一个网络应用程序,只有一个端点/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%),machine2应该返回4次(因为它的负载百分比为40%)。
我真的不知道应该采取什么策略来平衡它。
我考虑过一个计数器,用于计算每台机器的答案数,或者在0到10之间选择一个随机数字,并根据该数字决定哪个机器。但我认为它们不是好的方法,您有关于平衡的算法的任何想法吗?

走向随机。如果您的流量非常大,需要考虑负载平衡,那么伪随机方法应该就可以了。与计数(在有限时间窗口内)相比,无需保持状态。 - Harald
1
随机不保证正确的平衡,如果我不幸的话,machine1 可能会在每个请求中都被返回 :S - Mohamed Said Benmousa
1个回答

3
您需要在Host类中添加另一个变量:
public class Host {
    private String name;
    private int percentageLoad;
    private int percentageAccum;
}
percentageAccum的初始值是percentageLoad的值。
当接收到请求时:
  • 选择percentageAccum最大的主机
  • 从所选主机的percentageAccum中减去100
  • 对于所有主机(包括所选主机)将percentageLoad添加到percentageAccum
一个小优化是在更新所有主机的percentageAccum时确定下一个选择。

1
太棒了!表现和预期一样。 - Sebastiandg7
那个算法的直觉是什么呢? - Amr Saber
为了对算法有更好的理解,可以使用简单的示例(例如问题中的示例)运行算法。在每个步骤中,打印每个“Host”类的变量以及“percentageAccum”变量的总和。 - user3386109
@user3386109 你好,我在Java中实现了这个算法,并运行了10个样本调用。我的输出中有百分比路由的偏差。您能否请看一下pastebin上的这个结果,并告诉我是否发现了什么奇怪的地方?我不确定我在Java中哪里出错了!? - NoobEditor
@NoobEditor 如果你在SO上发布问题时附上代码([mcve]),我会帮你看一下。 - user3386109
@user3386109 这是答案链接,请帮忙! - NoobEditor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接