我想要一个简单的负载均衡器。
让我们说,我有两个服务器运行完全相同的Web服务。负载均衡器需要知道最近在每台服务器上调用Web服务的次数。建议客户使用较低的被叫服务器。
许多客户可以同时调用Web服务。
我需要一种方法来计算最后一分钟调用方法的次数。 最好不要使用任何锁来阻止并发调用而不要使用太多内存。调用方法的时间不一定准确。
答案 0 :(得分:0)
那么单个线程异步io(即node.js或twisted / tornado?)负载均衡器如何路由请求,同时保持必要的计数(不需要锁定)?在关闭请求时更新单个计数都应该是快速的“非阻塞”操作。
这两个库基本上都是io多路复用工具,可以充分利用单个线程而不是创建多个线程。鉴于网络应用程序的大部分运行时都在等待I / O,单个线程在i / o即将到来时执行其他代码的能力使其能够匹配或超过多线程服务器的性能。它使用epoll / select类似os函数来执行此操作。其中一个好处是不需要同步。
龙卷风(python)和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