Ich möchte Tracing in meiner Microservices-Architektur implementieren. Ich verwende Apache Kafka als Nachrichtenbroker und verwende kein Spring Framework. Tracing ist ein neues Konzept für mich. Zuerst wollte ich meine eigene Implementierung erstellen, aber jetzt möchte ich vorhandene Bibliotheken verwenden. Brave sieht aus wie die, die ich verwenden möchte. Ich würde gerne wissen, ob es Anleitungen, Beispiele oder Dokumente dazu gibt. Die Dokumentation auf der Github-Seite ist minimal und ich finde es schwierig, Brave zu verwenden. Oder vielleicht gibt es eine bessere Bibliothek mit geeigneter Dokumentation, die einfacher zu benutzen ist. Ich werde Apache HTrace betrachten, weil es vielversprechend aussieht. Einige Anfänger Guides werden nett sein.Zipkin, die vorhandene Bibliotheken verwenden, um Tracing in Microservices zu verwalten, die mit Apache Kafka verbunden sind
Antwort
Es gibt eine Reihe von Möglichkeiten, dies zu beantworten, aber ich werde es aus der "one-way" Perspektive beantworten. Die kurze Antwort, ich denke, du musst dich jetzt selbst rollen!
Während Kafka auf viele Arten verwendet werden kann, kann es als Transport für unidirektionale Einzelproduzenten einzelne Verbraucher Nachrichten verwendet werden. Diese Aktion ähnelt dem normalen unidirektionalen RPC, bei dem Sie eine Anfrage, aber keine Antwort haben.
In Zipkin ist ein RPC-Bereich normalerweise Anfrage-Antwort. Beispielsweise sehen Sie das Timing des Clients, der an den Server sendet, und auch den Weg zurück zum Client. One-Way ist, wo Sie die andere Seite weglassen. Die Zeitspanne beginnt mit einem "cs" (Client senden) und endet mit einem "sr" (Server empfangen).
Wenn Sie dies Kafka zuordnen, markieren Sie den Client, der gesendet wird, wenn Sie die Nachricht und den Server empfangen, wenn der Benutzer sie empfängt.
Der Trick zu Kafka ist, dass es keinen schönen Ort gibt, um den Trace-Kontext zu stopfen. Denn im Gegensatz zu vielen Messaging-Systemen gibt es in einer Kafka-Nachricht keine Header. Ohne einen Trace-Kontext wissen Sie nicht, welche Trace (oder Bereich für diese Angelegenheit) Sie gerade vervollständigen!
Der "Hack" -Ansatz besteht darin, Trace-Identifier als Nachrichtenschlüssel zu stopfen. Ein weniger hacky Weg wäre es, einen Body Wrapper zu koordinieren, in den Sie den Trace-Kontext einbetten können.
Hier ist ein Beispiel für ersteres:
https://gist.github.com/adriancole/76d94054b77e3be338bd75424ca8ba30
Ich treffe das gleiche Problem too.Here meine Lösung ist, eine weniger hacky Weise wie oben gesagt.
ServerSpan serverSpan = brave.serverSpanThreadBinder().getCurrentServerSpan();
TraceHeader traceHeader = convert(serverSpan);
//in kafka producer,user KafkaTemplete to send
String wrapMsg = "wrap traceHeader with originMsg ";
kafkaTemplate.send(topic, wrapMsg).get(10, TimeUnit.SECONDS);// use synchronization
//then in kafka consumer
ConsumerRecords<String, String> records = consumer.poll(5000);
// for loop
for (ConsumerRecord<String, String> record : records) {
String topic = record.topic();
int partition = record.partition();
long offset = record.offset();
String val = record.value();
//parse val to json
Object warpObj = JSON.parseObject(val);
TraceHeader traceHeader = warpObj.getTraceHeader();
//then you can do something like this
MyRequest myRequest = new MyRequest(traceHeader, "/esb/consumer", "POST");
brave.serverRequestInterceptor().handle(new HttpServerRequestAdapter(new MyHttpServerRequest(myRequest), new DefaultSpanNameProvider()));
//then some httprequest within brave-apache-http-interceptors
//http.post(url,content)
}
Sie müssen MyHttpServerRequest implementiert und MyRequest.It ist einfach, geben Sie einfach etwas, eine Spannweite Notwendigkeit, wie uri, header, Methode. Dies ist ein grober und hässlicher Code Beispiel, nur eine Idee anbieten.
- 1. Kafka + Sturm Topologie vs Microservices
- 2. Ermitteln, welche statischen Bibliotheken unnötigerweise verbunden sind
- 3. Verwenden Sie Apache Garn, um C++ - Anwendungen zu verwalten
- 4. Verwalten mehrerer Abhängigkeiten zwischen Microservices mit Maven
- 5. Ist jhipster die einzige Lösung, um Seiten und Felder zu erzeugen, die mit DB verbunden sind?
- 6. Onix-Dateien, die mit Shopify oder Wordpress verbunden sind [Hilfe]
- 7. Java, um die vorhandene Datei zu bearbeiten
- 8. Kann ich die vorhandene Socket-Verbindung verwenden?
- 9. Wie sollte ich Bibliotheken in Automake verknüpfen, die normalerweise mit pkg-config verbunden sind?
- 10. Welchen Code soll ich verwenden, um eine Datenbank zu verwalten, die mit einer Android/Apple App verbunden ist?
- 11. Clang scheint die gcc-Bibliotheken zu verwenden
- 12. um die Existenz von Kafka Thema in Nodejs zu überprüfen
- 13. Wo sind die Erlang-Bibliotheken?
- 14. Die beste Methode, um die Sitzung zwischen Servern zu verwalten?
- 15. Apache Kafka Client mit Selektor?
- 16. Erstellen von Menüverknüpfungen, die miteinander verbunden sind
- 17. Regulärer Ausdruck, um Kleinbuchstabenfolgen zu finden, die mit Unterstrich verbunden sind
- 18. Wie Bibliotheken zu überschreiben, die Funke in CDH
- 19. Mit R, um Daten in die vorhandene Spalte
- 20. Apache Storm (lokal) keine Verbindung zu Apache Kafka (lokal)
- 21. Verwalten/Verwenden von Bibliotheken mit Debug-Builds vs. Release-Builds
- 22. WSO2 MB vs Apache Kafka
- 23. Was sind die Pakete für Linux-Bibliotheken?
- 24. Verwenden der Apache Mahout Machine Learning-Bibliotheken
- 25. Apache Kafka Mehrere Verbraucherinstanzen
- 26. Was sind die Hauptmotivationen, um JNDI für Datenquellen zu verwenden?
- 27. Ist es möglich, die CommonJS-Bibliotheken noch zu verwenden?
- 28. Verwalten von nativen Bibliotheken mit Maven
- 29. Parsing Daten von Kafka in Apache Fink
- 30. Verwalten der Parallelität von Datenspeichern als Microservices-Skala
Okay, ich habe meine Antwort bekommen. Adrian Cole hat das zu [GitHub] hinzugefügt (https://github.com/openzipkin/brave/pull/212/files) – jpiechowka
warte, wie beantwortet das deine Frage ...? – EndingWithAli