Kafka Streams voor Azure Event Hubs
In dit artikel vindt u meer informatie over hoe u de Kafka Streams-clientbibliotheek kunt gebruiken met Azure Event Hubs.
Notitie
Kafka Streams-functionaliteit is alleen beschikbaar in openbare preview voor Event Hubs Premium- en Dedicated-lagen.
Overzicht
Apache Kafka Streams is een java-clientbibliotheek die een framework biedt voor het verwerken van streaminggegevens en het bouwen van realtime toepassingen op basis van de gegevens die zijn opgeslagen in Kafka-onderwerpen. Alle verwerkingen zijn gericht op de client, terwijl Kafka-onderwerpen fungeren als het gegevensarchief voor tussenliggende gegevens, voordat de uitvoer naar het doelonderwerp wordt geschreven.
Event Hubs biedt een Kafka-eindpunt dat moet worden gebruikt met uw bestaande Kafka-clienttoepassingen als alternatief voor het uitvoeren van uw eigen Kafka-cluster. Event Hubs werkt met veel van uw bestaande Kafka-toepassingen. Zie Event Hubs voor Apache Kafka voor meer informatie.
Kafka-streams gebruiken met Azure Event Hubs
Azure Event Hubs biedt systeemeigen ondersteuning voor zowel het AMQP- als het Kafka-protocol. Echter, om ervoor te zorgen dat compatibele Kafka Streams gedrag, sommige van de standaard configuratieparameters moeten worden bijgewerkt voor Kafka-clients.
Eigenschappen | Standaardgedrag voor Event Hubs | Gedrag gewijzigd voor Kafka-streams | Uitleg |
---|---|---|---|
messageTimestampType |
ingesteld op AppendTime |
moet worden ingesteld op CreateTime |
Kafka Streams is afhankelijk van tijdstempel voor het maken van een tijdstempel in plaats van een tijdstempel toe te voegen |
message.timestamp.difference.max.ms |
maximaal toegestane waarde is 90 dagen | Eigenschap wordt alleen gebruikt om eerdere tijdstempels te beheren. Toekomstige tijd is ingesteld op 1 uur en kan niet worden gewijzigd. | Dit is in overeenstemming met de kafka-protocolspecificatie |
min.compaction.lag.ms |
maximaal toegestane waarde is twee dagen | ||
Oneindige retentieonderwerpen | grootte gebaseerde afkapping van 250 GB voor elke onderwerppartitie | ||
Record-API verwijderen voor oneindige bewaaronderwerpen | Niet geïmplementeerd. Als tijdelijke oplossing kan het onderwerp worden bijgewerkt en kan een eindige bewaartijd worden ingesteld. | Dit wordt gedaan in algemene beschikbaarheid |
Andere overwegingen
Hier volgen enkele van de andere overwegingen waarmee u rekening moet houden.
- Kafka streams-clienttoepassingen moeten beschikken over beheer-, lees- en schrijfmachtigingen voor de volledige naamruimten om tijdelijke onderwerpen te kunnen maken voor stroomverwerking.
- Tijdelijke onderwerpen en partities tellen mee voor het quotum voor de opgegeven naamruimte. Deze moeten in overweging worden genomen bij het inrichten van de naamruimte of het cluster.
- Oneindige bewaartijd voor 'Offset' Store wordt beperkt door de maximale bewaartijd van het bericht van de SKU. Controleer Event Hubs-quota voor deze laagspecifieke waarden.
Deze omvatten het bijwerken van de onderwerpconfiguratie in het messageTimestampType
gebruik van de CreateTime
(dat wil gezegd, tijd voor het maken van gebeurtenissen) in plaats van de AppendTime
(dat wil gezegd, tijd voor het toevoegen van logboeken).
Als u het standaardgedrag (vereist) wilt overschrijven, moet de onderstaande instelling worden ingesteld in Azure Resource Manager (ARM).
Notitie
Alleen de specifieke onderdelen van de ARM-sjabloon worden weergegeven om de configuratie te markeren die moet worden bijgewerkt.
{
"parameters": {
"namespaceName": "contoso-test-namespace",
"resourceGroupName": "contoso-resource-group",
"eventHubName": "contoso-event-hub-kafka-streams-test",
...
"parameters": {
"properties": {
...
"messageTimestampType": "CreateTime",
"retentionDescription": {
"cleanupPolicy": "Delete",
"retentionTimeInHours": -1,
"tombstoneRetentionTimeInHours": 1
}
}
}
}
}
Concepten van Kafka Streams
Kafka-streams bieden een eenvoudige abstractielaag over de Producer- en Consumer-API's van Kafka om ontwikkelaars te helpen sneller aan de slag te gaan met realtime streamingscenario's. De lichtgewicht bibliotheek is afhankelijk van een met Apache Kafka compatibele broker (zoals Azure Event Hubs) voor de interne berichtenlaag en beheert een fouttolerante lokale statusopslag. Met de transactionele API biedt de Kafka-streamsbibliotheek ondersteuning voor uitgebreide verwerkingsfuncties, zoals precies eenmaal verwerken en één record tegelijk.
Records die buiten de order aankomen, profiteren van tijdgebaseerde vensterbewerkingen op basis van gebeurtenissen.
Notitie
We raden u aan vertrouwd te raken met de Kafka Streams-documentatie en de kernconcepten van Kafka Streams.
Stromen
Een stream is de abstracte weergave van een Kafka-onderwerp. Het bestaat uit een niet-afhankelijke, continu bijwerkende gegevensset van onveranderbare gegevensrecords, waarbij elke gegevensrecord een sleutel-waardepaar is.
Topologie voor stroomverwerking
Een Kafka-streamstoepassing definieert de rekenlogica via een DAG (gerichte acyclische grafiek) die wordt vertegenwoordigd door een processortopologie. De processortopologie bestaat uit streamprocessors (knooppunten in de topologie) die een verwerkingsstap vertegenwoordigen, die zijn verbonden door streams (randen in de topologie).
Stream-processors kunnen worden gekoppeld aan upstream-processors of downstreamprocessors, met uitzondering van bepaalde speciale gevallen:
- Bronprocessors: deze processors hebben geen upstream-processors en lezen uit een of meer streams rechtstreeks. Ze kunnen vervolgens worden gekoppeld aan downstreamprocessors.
- Sink-processors: deze processors hebben geen downstreamprocessors en moeten rechtstreeks naar een stream schrijven.
Streamverwerkingstopologie kan worden gedefinieerd met de Kafka Streams DSL of met de processor-API op een lager niveau.
Dualiteit van stromen en tabellen
Streams en tabellen zijn 2 verschillende maar nuttige abstracties die worden geleverd door de Kafka Streams DSL, waarbij zowel tijdreeks- als relationele gegevensindelingen worden gemodelleerd die naast elkaar moeten bestaan voor gebruiksscenario's voor stroomverwerking.
Kafka breidt dit verder uit en introduceert een dualiteit tussen streams en tabellen, waarbij een
- Een stroom kan worden beschouwd als een wijzigingslogboek van een tabel en
- Een tabel kan worden beschouwd als een momentopname van de meest recente waarde van elke sleutel in een stream.
Met deze dualiteit kunnen tabellen en streams door elkaar worden gebruikt zoals vereist voor de use-case.
Bijvoorbeeld
- Statische klantgegevens samenvoegen (gemodelleerd als een tabel) met dynamische transacties (gemodelleerd als een stroom) en
- Deelnemen aan veranderende portfolioposities in een day traders-portfolio (gemodelleerd als een stroom) met de meest recente marktgegevensfeed (gemodelleerd als een stroom).
Tijd
Kafka Streams maakt het mogelijk om vensters en respijtfuncties toe te staan dat gegevensrecords uit de volgorde worden opgenomen en nog steeds worden opgenomen in de verwerking. Om ervoor te zorgen dat dit gedrag deterministisch is, zijn er aanvullende noties van tijd in Kafka-streams. Deze omvatten:
- Aanmaaktijd (ook wel gebeurtenistijd genoemd): dit is het tijdstip waarop de gebeurtenis plaatsvond en de gegevensrecord is gemaakt.
- Verwerkingstijd: dit is het tijdstip waarop de gegevensrecord wordt verwerkt door de stroomverwerkingstoepassing (of wanneer deze wordt verbruikt).
- Toevoegtijd (ook wel 'Aanmaaktijd' genoemd): dit is het tijdstip waarop de gegevens worden opgeslagen en vastgelegd in de opslag van de Kafka-broker. Dit verschilt van de aanmaaktijd vanwege het tijdsverschil tussen het maken van de gebeurtenis en de daadwerkelijke opname door de broker.
Stateful bewerkingen
Statusbeheer maakt geavanceerde toepassingen voor stroomverwerking mogelijk, zoals het samenvoegen en aggregeren van gegevens uit verschillende streams. Dit wordt bereikt met statusarchieven die worden geleverd door Kafka Streams en worden geopend met behulp van stateful operators in de Kafka Streams DSL.
Stateful transformaties in de DSL zijn onder andere:
- Aggregeren
- Aansluiting
- Vensters (als onderdeel van aggregaties en joins)
- Aangepaste processors en transformatoren toepassen, die stateful kunnen zijn voor processor-API-integratie
Venster en respijt
Vensterbewerkingen in kafka Streams DSL stellen ontwikkelaars in staat om te bepalen hoe records worden gegroepeerd voor een bepaalde sleutel voor stateful bewerkingen, zoals aggregaties en joins.
Vensterbewerkingen bieden ook de specificatie van een respijtperiode enige flexibiliteit voor out-of-orderrecords voor een bepaald venster. Een record die is bedoeld voor een bepaald venster en arriveert na het opgegeven venster, maar binnen de respijtperiode wordt geaccepteerd. Records die binnenkomen nadat de respijtperiode is verstreken, worden verwijderd.
Toepassingen moeten gebruikmaken van de besturingselementen voor vensters en respijtperioden om fouttolerantie voor niet-orderrecords te verbeteren. De juiste waarden variëren op basis van de workload en moeten empirisch worden geïdentificeerd.
Verwerkingsgaranties
Zakelijke en technische gebruikers willen belangrijke zakelijke inzichten extraheren uit de uitvoer van werkbelastingen voor stroomverwerking, wat vertaalt naar hoge vereisten voor transactionele garantie. Kafka-streams werken samen met Kafka-transacties om ervoor te zorgen dat transactionele verwerkingsgaranties worden gegarandeerd door integratie met het onderliggende opslagsysteem van Kafka (zoals Azure Event Hubs) om ervoor te zorgen dat offsetdoorvoeringen en statusopslagupdates atomisch worden geschreven.
Om ervoor te zorgen dat transactionele verwerking garanties garandeert, moet de processing.guarantee
instelling in de Kafka Streams-configuraties worden bijgewerkt van de standaardwaarde naar at_least_once
exactly_once_v2
(voor clientversies op of na Apache Kafka 2.5) of exactly_once
(voor clientversies vóór Apache Kafka 2.5.x).
Volgende stappen
Dit artikel bevat een inleiding tot Event Hubs voor Kafka. Zie Ontwikkelaarshandleiding van Apache Kafka voor Azure Event Hubs voor meer informatie.
Zie quickstart: Gegevens streamen met Event Hubs met behulp van het Kafka-protocol voor een zelfstudie met stapsgewijze instructies voor het maken van een Event Hub en deze openen met behulp van SAS of OAuth.
Zie ook de OAuth-voorbeelden op GitHub.