java - 基于百分比分布算法的负载均衡器

标签 java algorithm rest load-balancing

<分区>

假设我有以下实体:

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

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

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

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

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

可能会混淆我要解释的内容,所以我举个例子:

假设我在数据库中有以下帐户:

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

如您所见,该帐户有 123 作为 ID 和两个主机,每个主机有一个百分比负载。

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

更清楚一点,假设我发出了 10 个类似的请求:localhost:8080/check?accountId=123,那么主机名 machine1 应该返回 6 次(因为它负载百分比为 60%),machine2 应该返回 4 次(因为它的负载百分比为 40%)。

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

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

最佳答案

您需要在 Host 类中添加另一个变量:

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

percentageAccum 的初始值是 percentageLoad 的值。

收到请求时:

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

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

关于java - 基于百分比分布算法的负载均衡器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52043418/

相关文章:

java - 如何对循环计算的点数求和?

java - 为非静态内部类实现有意义的 equals 方法

c - 如何制作平衡二叉树

来自 RESTful API 的 Django 流式传输 HTTP 响应

java - Spring boot Rest controller - 将表单编码的主体转换为 POJO

azure - 如何在通过 Azure DevOps Services 的 REST API 创建错误时查找发行说明字段的 API 端点

java - 是否有任何 Java 包结构模式可以证明默认可见性修饰符的存在?

java - 客户端状态保存,我可以通过什么方式查看发送到客户端的状态数据?

algorithm - 如何使用经过 10 个参数训练的人工神经网络对具有 3 个参数的实例进行分类?

algorithm - 寻找生成逼真的行星的算法