2016-03-29 3 views
9

Ich bewege mein Projekt von RabbitMQ nach Kafka und versuche zu verstehen, wie schnell reaktives Kafka sein wird.Wie verbessert man die langsame Leistung von reaktiven Kafka (Scala plus Akka Streams)?

Ich bin derzeit in der Lage, etwa 12K/sec triviale Nachrichten/Sek zu Rabbit zu schreiben, und beim Lesen einen trivialen Zug aus der Warteschlange durch einen "Hallo Welt" -Stream bei etwa 4K/Sek.

Ich bin mit reaktiven Streams nach Kafka gezogen, ich kann vielleicht 1M/sec schreiben - großer Gewinn! Aber in der gleichen Umgebung kann ich nur etwa 2K/sec durch den Strom auf Lese fließen hier die Vorgehensweise in den Beispielen: DummyConsumer.scala

Kennt jemand irgendwelche Tipps, wie ich die vergleichbar bis zu Ebenen lesen bekommen könnte zurück zum Kaninchenansatz?

Interessant: Ich habe es gerade "direkt" versucht (Zugriff auf Kafka über die rohen Java-Treiber vs reaktive Kafka) und bin über 22K liest, so dass das ziemlich gut ist. Es scheint etwas daran zu liegen, wie ich reaktiv benutze - Kafka verlangsamt die Dinge.

Ok ... Ich jage dieses Ding. Als nächstes probierte ich einen rohen Akka-Stream "Hallo Welt":

now = System.currentTimeMillis() 
count = 0 
val in2 = Source(1 to num) 
val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit b => 
    import GraphDSL.Implicits._ 
    val show = Flow[Int].map{ i => count +=1; if(count==num) println(s"time 2 ($count): "+(System.currentTimeMillis() - now)); i } 
    in2 ~> show ~> Sink.ignore 
    ClosedShape 
}) 
g.run() 
Thread.sleep(2000) 

Dies lief mit einer sehr schnellen 742K/sec! Kafka rohe ist also schnell und Akka-Streams sind schnell. Also ist der Schuldige irgendwo in der Frage, wie reaktives Kafka gebaut wird (oder wahrscheinlicher), wie ich versuche, es zu benutzen. Unter Berücksichtigung von Reibung sollte ich erwarten, etwas in der Nähe von 22 K/Sek. Hmm.

+0

Hallo Greg, reaktive Kafka-Entwickler hier. Wir beenden reactive-kafka 0.11, was Ihnen eine bessere Leistung bringen soll. Ältere Versionen sollten jedoch leistungsfähiger als nur 2K/s sein. Hast du noch deinen Code? Ich würde gerne sehen, wie Sie reaktives Kafka verwenden. – kciesielski

+0

Leider habe ich diesen Code nicht mehr. Im Grunde genommen habe ich eine cut'n-Paste aus dem Beispielcode in den Dokumenten gemacht ... nichts Besonderes. Ich wechselte und entwickelte ein Projekt, LateKafka (in GitHub), um eine Quelle für Akka-Streams zu schaffen. Es ist wirklich schnell - ich zog 6-stellige Transaktionen pro Sekunde Kafka-Thru-Stream für einen trivialen Stream. Spannende Neuigkeiten über 0.11. Es wird cool sein, es auszuprobieren. – Greg

+0

Hallo Jacek, ich habe gerade meinen Test mit der neuen Version 0.11 neu aufgebaut. Es ist viel schneller als die M-Serie, aber ich bin immer noch nicht in der Lage, die hohen Zahlen zu reproduzieren, die andere gezeigt haben.Hinweis: Ich versuche nur etwas Leistung zu erzielen - mein wirklicher Anwendungsfall verwendet Streams DSL, die in den Dokumenten nicht angezeigt werden. Ich habe Code hier in einer anderen Frage geschrieben: http://stackoverflow.com/questions/39617827/why-dont-i-see-high-performance-with-reactive-kafka-0-11-release – Greg

Antwort

0

nicht eine vollständige Antwort, aber versuchen Sie es erneut, aber die jüngste (Sept. 2016) Akka Streams Kafka 0.11

gibt es erhebliche Leistungsverbesserungen. Wir haben einige Benchmarks gemacht, und während es noch einen Overhead vom reaktiven Kafka-Wrapper gibt (obwohl man im Hinterkopf hat, dass man auch etwas zurückbekommt: zB alle Vorteile einer netten API mit asynchronem Gegendruck!), Die Gesamtanzahl sieht sehr gut aus und wird besser.

Hier ein paar allgemeine Szenarien Kafka-Nutzung, die alte Blind kafka Version (M4) zu vergleichen, um die aktuelle Version (0.11) und eine äquivalente Funktionalität implementiert Ebene Kafka mit Producers/Consumers (aber nicht berücksichtigt, natürlich Verbindung mit anderen reaktiven Komponenten).

http://blog.akka.io/assets/kafka-bench1.png

Mehr unter "Benchmarking akka-stream-kafka" von Krzysiek Ciesielski.

+0

Hinweis: Ich postete die Antwort vor dem Lesen der Kommentare;) – VonC

+0

Ich habe Probleme mit der neuen Bibliothek. Ran-Code wie in diesem Sinne: https://gist.github.com/gzoller/8847556ab1347b886d80cf53c3a1e867 Dies führte zu einer Reihe von "Dead Letter" -Fehlern, die versuchten, den Batch-Hinweis aus der Dokumentation zu verwenden. Ich habe auch eine Variante versucht, bei der ich nur den Kopf jeder Charge festlege (d. H. Den letzten Offset). Das hat mir keine toten Buchstabenfehler gegeben, aber es hat auch keinen sauberen Satz von Partitionsversätzen erzeugt. – Greg

+0

@Greg Seltsam. Sie könnten eine neue Frage basierend auf diesem Beispiel stellen, um zu sehen, ob ein tatsächlicher Akka Streams Kafka-Experte hereinspielen kann. – VonC