2017-06-26 2 views
1

Wir fangen an, Kafka in einer Backend-Neuentwicklung zu verwenden und haben eine kurze Frage, wie wir die Nachrichten, die wir produzieren und konsumieren, strukturieren.Hinzufügen eines Typs zu Nachrichten in Kafka?

Stellen Sie sich vor, wir haben einen Benutzer-Microservice, der CRUD-Operationen für Benutzer abwickelt. Die zwei Strukturen, die als eine Möglichkeit vorgeschlagen wurden, sind:

1) Vier kafka Themen, eins für jede Operation. Der Nachrichtenwert enthalten würde nur die Daten benötigt, um die Operation durchzuführen, dh

topic: user_created 
message value: { 
    firstName: 'john' 
    surname: 'smith' 
} 

topic: user_deleted 
message value: c73035d0-6dea-46d2-91b8-d557d708eeb1 // A UUID 

and so on 

2) Ein einzelnes Thema für Veranstaltungen Benutzer im Zusammenhang mit einer Eigenschaft auf die Nachricht, die die Aktion beschreibt, genommen werden, sowie die Daten benötigt, dh

// User created 
topic: user_events 
message value: { 
    type: 'user_created', 
    payload: { 
     firstName: 'john' 
     surname: 'smith' 
    } 
} 

// User deleted 
topic: user_events 
message value: { 
    type: 'user_deleted', 
    payload: c73035d0-6dea-46d2-91b8-d557d708eeb1 // A UUID 
} 

ich bin für das erste System beschrieben, obwohl meine Unerfahrenheit mit Kafka mir unmöglich macht, stark zu argumentieren, warum. Wir würden jeden Input von erfahreneren Benutzern sehr schätzen.

Antwort

1

Ich arbeitete vor kurzem an dieser Art von Architektur.

Wir verwendeten ein API Gateway, welches der Webservice war, der mit unserem Frontend kommuniziert (in unserem Fall ReactJS). Dieser API-Gateway hat das REST-Protokoll verwendet. Der mit Spring Boot entwickelte Microservice fungiert in einem separaten Thread als Produzent und Konsument.

1- Producing Nachricht: Nachricht an Kafka Broker zum Thema "producer_topic"

2- Nachricht Konsumieren: Hören Sie die eingehenden Nachrichten von Kafka zum Thema "consumer_topic"

Für raubend es einen Pool von Threads, die die eingehenden Nachrichten und den Ausführungsdienst, die Kafka Stream und senden hören, behandeln, weisen die Nachrichtenbehandlung einem Thread aus dem Pool zu.

Unten gab es einen DAO-Microservice, der Kafka-Nachrichten verarbeitet und das CRUD-Zeug erledigt hat.

Nachrichtenformat sah wirklich wie Ihre zweite Annäherung aus.

//content of messages in the consumer_topic 
{ 
    event_type: 'delete' 
    message: { 
     first_name: 'John Doe' 
     user_id: 'c73035d0-6dea-46d2-91b8-d557d708eeb1' 
    } 
} 

Deshalb sollte ich Ihnen den zweiten Ansatz empfehlen. Es gibt weniger Komplexität, da Sie alle Crud-Operationen mit nur einem Thema behandeln. Aufgrund der Partitions-Parallelität ist es sehr schnell und Sie können Replikation hinzufügen, um fehlertoleranter zu sein.

Der erste Ansatz klingt gut in Bezug auf Dematerialisierung und Trennung von Bedenken, aber es ist nicht wirklich skalierbar. Nehmen wir zum Beispiel an, Sie möchten zusätzliche Operationen hinzufügen, es ist ein weiteres Thema, das hinzugefügt werden soll. Sehen Sie sich auch die Replikation an. Sie werden mehr Repliken haben und das ist ziemlich schlimm, denke ich.

+0

Danke für deine Antwort. Die Architektur, die Sie beschreiben, klingt sehr ähnlich zu dem, was wir geplant haben. Sehr hilfreiche Informationen. –

+0

Froh, dass es geholfen hat! –

2

Kafka-Nachrichten haben keinen zugeordneten Typ.

Mit einem Thema-pro-Ereignis-Typ müssten Sie sich Sorgen über die Reihenfolge der Ereignisse in Bezug auf die gleiche Entität aus den verschiedenen Themen lesen. Aus diesem Grund würde ich empfehlen, alle Ereignisse in dasselbe Thema zu stellen. Auf diese Weise müssen Clients nur ein einzelnes Thema konsumieren, um den Status jeder Entität vollständig verfolgen zu können.

+0

Danke für die Antwort, ich hatte nicht Reihenfolge der Operationen über Themen berücksichtigt beibehalten, aber das ist natürlich wichtig, und ich könnte sich vorstellen, es wäre etwas nicht trivial zu lösen. –

0

Beachten Sie, dass Sie selbst dann, wenn Sie ein einzelnes Thema verwenden, mehr als eine Partition für die Skalierbarkeit der Verbraucher haben sollten.Kafka bietet Ihnen die Möglichkeit, auf Partitionsebene zu bestellen, also nicht auf Themenebene. Es bedeutet, dass Sie einen "Schlüssel" verwenden sollten, um eine Ressource, die Sie erstellen, löschen, aktualisieren, um die Nachricht in Bezug auf diesen "Schlüssel" immer in der gleichen Partition, also mit der richtigen Reihenfolge sonst mit einem einzigen Thema Sie könnte die Nachrichtenreihenfolge verlieren, wenn Nachrichten auf verschiedenen Partitionen gesendet werden.

Verwandte Themen