【问题标题】:how to calculate a method's call frequency如何计算方法的调用频率
【发布时间】:2017-08-03 11:21:58
【问题描述】:

我想编写一个简单的负载均衡器。

假设,我有两台服务器运行完全相同的 web 服务。负载均衡器需要知道最近在每台服务器上调用了多少次 web 服务。下层调用的服务器会被推荐给客户端使用。

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

我需要一种方法来计算一个方法在最后一分钟被调用了多少次。 最好不要使用任何锁来阻塞并发调用,也不要使用太多内存。调用方法的次数不一定要准确。

【问题讨论】:

    标签: load rate


    【解决方案1】:

    那么,单线程异步 io(即 node.js 或 twisted/tornado?)负载均衡器将路由请求,同时保持必要的计数(不需要锁)?在我们传递请求时更新单个计数都应该是快速的“非阻塞”操作。

    这两个库基本上都是 io 多路复用工具,它们充分利用单个线程而不是创建多个线程。鉴于网络应用程序的大部分运行时都在等待 i/o,单线程在 i/o 到来时执行其他代码的能力使其能够匹配或超过多线程服务器的性能。它使用 epoll/select 之类的 os 函数来执行此操作。好处之一是不需要同步。

    tornado (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
    

    【讨论】:

    • 如何将计数调整为过去的时间。只是最近打电话的事。
    • 需要计算移动平均线,这要求您保留与窗口中所有请求一样长的路由决策列表。列表可以很简短(即服务器 1 为 0,服务器 2 为 1,等等。要保留在数组中的项目数应该是您最近定义的请求数的估计值。
    • 或者如果你想做一个运行总和,见上文。只要 route_request(...) 函数立即处理请求并且不阻塞,它就会工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多