i dagens databehandlingsarkitekturer bruges Apache Kafka ofte i ingress-fasen. Normalt bruges dette trin til at berige og filtrere de indgående meddelelsesdata; det er dog ikke muligt at foretage interaktive forespørgsler før et senere tidspunkt i databehandlingsrørledningen. Dette skyldes, at selvom hver meddelelse i et Kafka-emne vedvarer som standard, er der endnu ingen mekanisme tilgængelig, der giver mulighed for hurtige opslag af en bestemt meddelelse i et emne.
ikke desto mindre ville det at være i stand til at forespørge nye data på dette tidlige tidspunkt i rørledningen undgå forsinkelser i traditionelle behandlingsrørledninger, der normalt inkluderer langvarige batchforarbejdningstrin og ville give slutbrugerne næsten øjeblikkelig adgang til indgående data.
til opbygning af databehandlingsapplikationer med Kafka bruges Kafka Streams-biblioteket, der vedligeholdes som en del af Kafka-projektet, ofte til at definere datatransformationer og analyser. Et vigtigt træk ved Kafka Streams er statsbutikker, der tilbyder en abstraktion af en hurtig lokal Nøgleværdibutik, der kan læses og skrives til, når man behandler meddelelser med Kafka Streams. Disse Nøgleværdibutikker kan løbende udfyldes med nye meddelelser fra et Kafka-emne ved at definere en passende streamprocessor, så det nu er muligt hurtigt at hente meddelelser fra det underliggende emne.
Vi bygger oven på denne Kafka Streams-funktionalitet og opretter en samlet REST API, der giver et enkelt forespørgselsendepunkt for et givet Kafka-emne.
sammenfattende kan kombination af Kafka Streams-processorer med Statsforretninger og en HTTP-server effektivt gøre ethvert Kafka-emne til en hurtig skrivebeskyttet nøgleværdibutik.
Kafka Streams er bygget som et bibliotek, der kan integreres i en selvstændig Java eller Scala program. Det giver udviklere mulighed for at definere streamprocessorer, der udfører datatransformationer eller aggregeringer på Kafka-meddelelser, hvilket sikrer, at hver inputmeddelelse behandles nøjagtigt en gang. Ved hjælp af Kafka Streams DSL, som er inspireret af Java Stream API, kan stream-processorer og statsbutikker fleksibelt kædes.når du starter flere forekomster af en Kafka-Streams-baseret applikation, danner processerne automatisk en belastningsbalancering, meget tilgængelig behandlingsklynge uden at være afhængig af andre eksterne systemer end Kafka.
for at illustrere arkitekturen i en Kafka Streams-applikation, der anvender statsbutikker, kan du forestille dig følgende scenarie: som jernbaneoperatør, hver gang en kunde booker en tur på vores hjemmeside, indsættes en ny meddelelse bestående af kunde-id og et tidsstempel i et Kafka-emne. Specifikt indsætter en eller flere Kafka-producenter disse meddelelser i et emne med ni partitioner. Da kunde-id ‘ et vælges som nøgle for hver meddelelse, indsættes data, der tilhører en given kunde, altid i den samme partition af emnet. Implicit bruger Kafka-producenter DefaultPartitioner til at tildele meddelelser til partitioner.
Antag nu, at vi har et Kafka-Streams-program, der læser meddelelser fra dette emne og fortsætter dem i en statsbutik. Da nøglen til hver meddelelse kun består af kunde-id, vil den tilsvarende værdi i statsbutikken altid være tidsstemplet for kundens seneste reservation. For at opnå den maksimale grad af parallel behandling kan vi starte op til ni forekomster af Kafka Streams-applikationen. I dette tilfælde tildeles hver applikationsinstans nøjagtigt en af emnepartitionerne. For hver inputpartition opretter Kafka Streams en separat statsbutik, som igen kun indeholder dataene fra de kunder, der tilhører den partition.
den resulterende applikationsarkitektur er illustreret i nedenstående diagram.