Finagle No asyncronous execution

时间:2016-06-04 06:01:17

标签: scala thrift finagle

我有一个简单的finagle thrift服务器:

import com.twitter.finagle.Thrift
import scala.concurrent.Future

import com.twitter.util.{ Await, Future }
object Main{

  def main(args: Array[String]) {

    var count = 0

    val myserver = Thrift.serveIface("0.0.0.0:9090", new RealTimeDatabasePageImpressions[com.twitter.util.Future] {

      def saveOrUpdate(pageImpression: PageImpressions):
      com.twitter.util.Future[Boolean] = {
    count += 1
    println(count)
    com.twitter.util.Future.value(true)
      }
    }

   Await.ready(myserver)
  }

}

这个服务器有效但我有一个大问题:我用for循环写了一个thrift nodejs客户端。它执行10.000节俭请求。但它不是异步的。它执行500请求并停止。一段时间后,2或3秒,将执行300多个请求。现在的问题是:为什么会这样?我的服务器或客户端出了什么问题?我只使用apache thrift生成的nodejs代码。没有包装。该功能执行了10.000次。我认为nodejs不是问题所在:

function callFunc(i){
    console.log("started executing: " + i);
    var connection = thrift.createConnection("IP", 9090, {
    transport: transport,
    protocol: protocol
    });

    connection.on('error', function (err) {
    console.log(err);
    });

    // Create a Calculator client with the connection
    var client = thrift.createClient(Realtime_pageImpressions, connection);


    var rand = Math.random() * (20000 - 1);

    var trackId = trackIds[Math.round(Math.random() * 10)];
    var values = new PageImpressions({
    trackId: trackId,
    day: 4,
    hour: 4,
    minute: 13,
    pageId: 'blabla',
    uniqueImpressions: Math.random() * (13000 - 1),
    sumImpressions: Math.random() * (1000450 - 1)
    });

    client.saveOrUpdate(values, function (error, message) {
    if (message) {
        console.log("Successful, got Message: " + message);
    } else {
        console.log("Error with Message: " + error);
    }
    });
    return true;
}
for(var i = 0; i < 10000; i++){
    callFunc(i);
}

1 个答案:

答案 0 :(得分:0)

您的var count未同步。这是一个非常大的问题,但可能与您的性能问题无关。 你也阻止了finagle线程,这也是一个大问题,但在你的模拟情况下并不重要,因为没有等待时间。

以这种方式思考。让我们说,你有一个cpu(你可能有几个,但机器上还有其他的东西),你要求它同时执行10000个操作

这怎么办?它必须执行其中一个请求,保存上下文,堆栈,刷新所有缓存,切换到下一个请求,执行那个...

每2个请求在2秒内发出4个请求。这听起来不是很糟糕吗?

另外,您是否已经转动了GC(在服务器和客户端上)?如果请求是以突发方式处理,然后是长时间暂停,那么这可能是完整GC踢的迹象