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