c++ - 向节点有效发送请求的算法

标签 c++ algorithm math distributed-computing

我想根据每个节点的配置将流量统一分配给各个节点。最多可以有 100 个节点和分配给多个节点的流量百分比 可以配置。


所以说,如果有 4 个节点:-

node 1 - 20
node 2 - 50
node 3 - 10
node 4 - 20
------------
sum    - 100
------------

所有节点的总和应为 100。 示例:-

node 1 - 50
node 2 - 1
node 3 - 1
node 4 - 1
.
.
.
node 100 - 1

在上面的配置中,共有 51 个节点。节点1为50,其余50个节点配置为1。

在一个场景中,请求可以按以下模式分发:- node1,node2,node3,node4,node5,....,node51,node1,node1,node1,node1,node1,node1,node1,......

上面的分布是低效的,因为我们不断地向节点 1 发送过多的流量, 这可能会导致 node1 拒绝请求。

在另一个场景中,请求可以按以下模式分发:- node1,node2,node1,node3,node1,node4,node1,node5,node1,node6,node1,node7,node1,node8……

在上面的 senario 请求被更有效地分发。

我找到了下面的代码,但无法理解它背后的想法。

func()
{
  for(int itr=1;itr<=total_requests+1;itr++)
  {
      myval = 0;           
      // Search the node that needs to be incremented
       // to best approach the rates of all branches                      
      for(int j=0;j<Total_nodes;j++)
      {

         if((nodes[j].count*100/itr > nodes[j].value) ||
           ((nodes[j].value - nodes[j].count*100/itr) < myval) ||
           ((nodes[j].value==0 && nodes[j].count ==0 )))
              continue;

            cand = j;
            myval = abs((long)(nodes[j].count*100/itr - nodes[j].value));
       }
       nodes[cand].count++;

  }

  return nodes[cand].nodeID;
}

在上面的代码中,total_requests 是到目前为止收到的请求总数。 total_requests 变量每次都会递增,将其视为全局值以便于理解。

Total_nodes 是配置的节点总数,每个节点使用以下结构表示。

节点是一个结构:-

struct node{
  int count;
  int value;
  int nodeID;
};

例如:-

If 4 nodes are configured :-
node 1 - 20
node 2 - 50
node 3 - 10
node 4 - 20
------------
sum    - 100
------------

将使用以下值创建四个节点[4]:-

node1{
  count = 0;
  value = 20;
  nodeID = 1;
};

node2{
  count = 0;
  value = 50;
  nodeID = 2;
};

node3{
  count = 0;
  value = 10;
  nodeID = 3;
};

node4{
  count = 0;
  value = 20;
  nodeID = 4;
};

能否请您向我解释一下它实际上如何有效地分发它的算法或想法。

最佳答案

nodes[j].count*100/itr 是节点 j 到目前为止已回答的请求百分比的下限。 nodes[j].value 是节点 j 应该回答的请求的百分比。您发布的代码寻找最落后于其目标百分比的节点(或多或少,受整数除法的影响)并为其分配下一个请求。

关于c++ - 向节点有效发送请求的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25331234/

相关文章:

c++ - shell 扩展:IShellExtInit::Initialize 调用了 4 次

c++ - C++ 中的继承和命名空间

c++ - 在 Qt 中加载外部样式表

python - 如何使用 Python 简单地添加组合元音每个辅音

c++ - 给定两组 xyz 坐标和 sag (a) 的值,我可以在 OpenGL 中的这些点之间绘制悬链线吗?

python : intersection geometrical objects in 3D space

javascript - 如何在 3D 空间内实现 2D 透视(CSS 和 jQuery)

c++ - 使用重载的下标运算符赋值

arrays - 在给定数组中查找具有最小 LCM 值的对

python - 使用两种方法计算方差在Python中返回不同的结果