【问题标题】:Finagle No asyncronous executingFinagle 没有异步执行
【发布时间】:2016-10-04 06:15:20
【问题描述】:

我有一个简单的 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 循环的节俭 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);
}

【问题讨论】:

    标签: scala thrift finagle


    【解决方案1】:

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

    这样想。假设您有一个 cpu(您可能有多个,但机器上还有其他事情),并且您要求它同时执行 10000 个操作所有。 p>

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

    2 秒内 500 个请求是每个请求 4 毫秒。听起来没那么糟糕,是吗?

    另外,您是否打开了 GC(在服务器和客户端上)?如果请求在突发处理后出现长时间的停顿,这可能是 Full GC 开始的标志

    【讨论】:

    • 对我来说:听起来很糟糕。我的意思是 kafka 可以用三台机器每秒处理 2 个 mio 请求。 2 秒内 500 个请求听起来很糟糕。但我会检查它。您还有其他处理更多请求的策略吗?
    • 不知道你的 2 百万号码是从哪里得到的。 Kafka 官方基准页面承诺 100k 条消息:kafka.apache.org/07/performance.html。另外,请注意,“每秒”和“同时”不是一回事,“机器”不是一个非常精确的规范,Kafka 是 io-bound,而你的东西是 all-cpu .. .
    • 另外,你有没有打开你的GC(在服务器和客户端上)?如果请求在突发处理后出现长时间的停顿,这可能是完全 GC 开始的迹象。
    • 是的,我检查了 GC。不是瓶颈。我在没有 finagle thrift 包装器的情况下测试了应用程序。 10.000 个请求/秒。问题肯定是节俭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2016-03-23
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多