in de huidige dataverwerkingsarchitecturen wordt Apache Kafka vaak gebruikt in de inkomende fase. Meestal wordt deze stap gebruikt om de inkomende berichtgegevens te verrijken en te filteren; het is echter niet mogelijk om interactieve query ‘ s te maken tot een later stadium in de dataverwerkingspijplijn. Dit komt omdat, hoewel elk bericht in een Kafka-onderwerp standaard wordt voortgezet, er nog geen mechanisme beschikbaar is dat snelle lookups van een specifiek bericht in een onderwerp mogelijk maakt.
niettemin zou de mogelijkheid om in dit vroege stadium in de pijplijn nieuwe gegevens te bevragen de vertragingen van de traditionele verwerkingspijpleidingen, die gewoonlijk langdurige voorbewerkingsstappen voor batchverwerking omvatten, voorkomen en de eindgebruikers bijna onmiddellijke toegang geven tot inkomende gegevens.
voor het bouwen van dataverwerkingstoepassingen met Kafka wordt de Kafka Streams-bibliotheek, die wordt onderhouden als onderdeel van het Kafka-project, vaak gebruikt om datatransformaties en analyses te definiëren. Een belangrijk kenmerk van Kafka Streams zijn state stores, het aanbieden van een abstractie van een snelle lokale sleutel-waarde winkel die kan worden gelezen en geschreven om bij het verwerken van berichten met Kafka Streams. Deze Key-Value stores kunnen continu worden gevuld met nieuwe berichten uit een Kafka topic door het definiëren van een geschikte stream processor, zodat het nu mogelijk is om snel berichten uit het onderliggende onderwerp op te halen.
voortbouwend op deze Kafka Streams-functionaliteit, maken we een unified REST API die een enkel querying-eindpunt biedt voor een bepaald Kafka-onderwerp.
samengevat kan het combineren van Kafka Streams processors met Statusopslag en een HTTP-server elk Kafka-onderwerp effectief veranderen in een snel alleen-lezen sleutelwaardeopslag.
Kafka Streams is gebouwd als een bibliotheek die kan worden ingebed in een zelfstandige Java-of Scala-toepassing. Het stelt ontwikkelaars in staat om stream processors die gegevens transformaties of aggregaties uit te voeren op Kafka berichten te definiëren, ervoor te zorgen dat elk Invoerbericht precies één keer wordt verwerkt. Met behulp van de Kafka Streams DSL, die is geà nspireerd door de Java Stream API, stream processors, en state stores kunnen flexibel worden geketend.
bovendien, wanneer meerdere instanties van een Kafka Streams-gebaseerde applicatie worden gestart, vormen de processen automatisch een load-balancing, zeer beschikbare verwerkingscluster zonder afhankelijk te zijn van andere externe systemen dan Kafka.
om de architectuur van een Kafka Streams-applicatie te illustreren die gebruik maakt van state stores, stelt u zich het volgende scenario voor: als spoorwegexploitant wordt elke keer dat een klant een reis boekt op onze website een nieuw bericht ingevoegd dat bestaat uit de klant-id en een tijdstempel in een Kafka-onderwerp. Specifiek, een of meer Kafka producenten voegen deze berichten in een onderwerp met negen partities. Omdat de klant-id wordt gekozen als de sleutel voor elk bericht, gegevens die behoren tot een bepaalde klant zal altijd worden ingevoegd in dezelfde partitie van het onderwerp. Impliciet gebruiken Kafka-producenten de DefaultPartitioner om berichten toe te wijzen aan partities.
neem nu aan dat we een Kafka Streams applicatie hebben die berichten van dit onderwerp leest en ze in een Statusopslag voorthoudt. Omdat de sleutel van elk bericht alleen bestaat uit de klant-id, zal de overeenkomstige waarde in de state store altijd de tijdstempel van de laatste boeking van de klant zijn. Om de maximale mate van parallelle verwerking te bereiken, kunnen we tot negen instanties van de Kafka Streams applicatie opstarten. In dit geval zal elke toepassing instantie precies een van de topic partities toegewezen krijgen. Voor elke invoerpartitie maakt Kafka Streams een aparte Statusopslag, die op zijn beurt alleen de gegevens bevat van de klanten die tot die partitie behoren.
de resulterende toepassingsarchitectuur wordt in het onderstaande diagram geïllustreerd.