2016-06-04 8 views
0

i einen einfachen finagle thrift Server:Keine asynchrone Finagle Ausführung

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) 
    } 

} 

Dieser Server funktioniert, aber ich habe ein großes Problem: Ich habe einen thrift NodeJS Client mit einem for-Schleife geschrieben. Es führt 10.000 Sparsamkeitsanforderung aus. Aber es ist nicht asynchron. Es führt 500 Anfragen aus und stoppt. Nach einer Weile, 2 oder 3 Sekunden, werden 300 weitere Anfragen ausgeführt. Jetzt die Frage: Warum passiert das? Stimmt etwas nicht mit meinem Server oder Client? Ich benutze nur die Apache-Sparsamkeit generierten Nodejs-Code. Kein Wrapper. Die Funktion wurde 10.000 mal ausgeführt. Ich denke, der Nodejs ist nicht das Problem:

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); 
} 

Antwort

0

Ihre var count ist unsynchronisiert. Dies ist ein sehr großes Problem, aber wahrscheinlich nicht mit Ihrem Leistungsproblem verbunden. Sie blockieren auch Finagle-Thread, was auch ein großes Problem ist, aber in Ihrem Mock-Fall spielt es keine Rolle, weil es keine Wartezeit gibt.

Denken Sie darüber nach. Nehmen wir an, Sie haben eine CPU (Sie haben wahrscheinlich mehrere, aber es gibt noch andere Dinge auf der Maschine), und Sie bitten es, 10000 Operationen alle zur gleichen Zeit auszuführen.

Wie kann das funktionieren? Es muss eine der Anforderungen ausführen, den Kontext speichern, den Stapel speichern, alle Cachespeicher leeren, zur nächsten Anfrage wechseln, diese ausführen ...

500 Anfragen in 2 Sekunden sind 4 Millisekunden pro Anfrage. Klingt nicht so schlimm, oder?

Haben Sie Ihren GC (sowohl auf dem Server als auch auf dem Client) ebenfalls aktiviert? Wenn Anfragen in Bursts gefolgt von langen Pausen verarbeitet werden, ist das wahrscheinlich ein Zeichen für einen vollen GC-Kick in

+0

Für mich: Es klingt wirklich schlecht. Ich meine, Kafka kann 2 Millionen Anfragen pro Sekunde mit drei Maschinen bearbeiten. 500 Anfragen in 2 Sekunden klingen wirklich schlecht. Aber ich werde es überprüfen. Haben Sie andere Strategien, um mehr Anfragen zu bearbeiten? –

+0

Ich weiß nicht, wo Sie Ihre 2-Mil-Nummer bekommen haben. Die offizielle Kafka-Benchmark-Seite verspricht 100.000 Nachrichten: http://kafka.apache.org/07/performance.html. Beachten Sie auch, dass "pro Sekunde" und "zur gleichen Zeit" nicht ganz dasselbe ist, dass "Maschine" keine sehr genaue Spezifikation ist, dass Kafka io-gebunden ist, während Ihre Sachen all-cpu sind. – Dima

+1

Haben Sie Ihren GC (sowohl auf dem Server als auch auf dem Client) ebenfalls aktiviert? Wenn Anfragen in Bursts gefolgt von langen Pausen verarbeitet werden, ist dies wahrscheinlich ein Zeichen dafür, dass sich der GC voll eingeschlichen hat. – Dima