2017-08-03 67 views
0

我想要一个简单的负载均衡器。如何计算方法的呼叫频率

比方说,我有两台服务器运行完全相同的web服务。负载平衡器需要知道每个服务器上近期调用Web服务的次数。较低的被叫服务器将被推荐被客户使用。

webservice可以被许多客户端同时调用。

我需要一种方法来计算方法在最后一刻被调用的次数。 最好不要使用任何锁来阻止并发调用,也不要使用太多的内存。一个方法被调用的时间不一定要精确。

回答

0

那么单线程异步IO(即node.js或twisted/tornado?)如何负载均衡器路由请求,同时它维护必要的计数(不需要锁)?在我们处理请求时更新单个计数应该是快速的“非阻塞”操作。

这两个库基本上都是io复用工具,可以充分利用单个线程而不是创建多个线程。鉴于大多数网络应用程序的运行时间正在等待I/O,单线程在I/O即将到来时执行其他代码的能力使其能够匹配或超出多线程服务器的性能。它使用epoll/select像os函数来做到这一点。其中一个好处是不需要同步。

一些相当小的工作示例在龙卷风(蟒蛇)代理和node.js的: https://codeforgeek.com/2015/12/reverse-proxy-using-expressjs/ https://gist.github.com/netdesign/1267537/635425784393fc8397fb928d1e573e4495696d82

要使用移动总,您需要定义一个窗口(每个时间段估计通话中定义窗口)。

然后(伪代码):

var server1sum = 0, 
    server2sum = 0, 
    routes = [], 
    window = <number of requests to keep>; 

function route(request): 
     if server1sum < server2sum : 
      route_request(server1) 
      routes.push(1) 
      server1sum += 1 
     else : 
      route_request(server2) 
      routes.push(2) 
      server2sum += 1 

     while routes.length > window : 
      x = routes.shift() 
      if x == 1 : 
       server1sum -= 1 
      else : 
       server2sum -= 2 
+0

如何调整计数随着时间的过去。只是最近通话事宜。 – lcm

+0

需要计算一个移动平均值,这需要您保留一个与您的窗口中的所有请求一样长的路由决策列表。列表可以是简短的(即,对于服务器1为0,对于服务器2为1等等。保持在阵列中的项目数量应该是估计最近的定义中的请求数# –

+0

或者如果您想要执行运行总和,请参阅只要route_request(...)函数立即传递请求并且不阻塞,它就可以工作。 –