- Visão geral
- Docker compose
- Benchmark consumidores
- Avro
- Schema registry
- Kafka Configs
- Scripts
- Outros scripts para os exemplos de código
Kafka
SDK .net
- Commit informando offset é sincrono
- É um wrapper da library librdkafka, assim como todas outras linguagens, exceto Java.
- Não permite consumir tópico sem gerar o grupo consumidor (group.id).
- O projeto librdkafka não suporta a feature. Issue: confluentinc/librdkafka#3261
- Issue do wrapper .net: confluentinc/confluent-kafka-dotnet#1697
Template para subir serviço local.
Fonte: https://github.com/confluentinc/cp-all-in-one
# subir serviço
docker compose up -d
# remover serviço
docker compose down
.net basic java basic
10 milhões: Concluído em 00:00:10.9476809 10 milhões: Concluído em 00:00:03. Millis: 3.100
50 milhões: Concluído em 00:00:42.3009102 50 milhões: Concluído em 00:00:14. Millis: 14.852
.net avro java avro
10 milhões: Concluído em 00:00:21.0839030 10 milhões: Concluído em 00:00:09. Millis: 9.465
50 milhões: Concluído em 00:01:34.9580854 50 milhões: Concluído em 00:00:38. Millis: 38.270
- Especificação: https://avro.apache.org/docs/1.11.1/specification/
- Exemplo código: https://github.com/confluentinc/confluent-kafka-dotnet/blob/master/examples/AvroSpecific/Program.cs
- Source generator: Confluent.Apache.Avro.AvroGen ✔️
Plugin mais antigo, mas sem margem de personalziação que possa causar errors de namespace.
dotnet tool install -g Confluent.Apache.Avro.AvroGen
avrogen -s ./Pessoa.avsc .
- Source generator: Apache.Avro.Tools ❌
Plugin mais atual, porém possui a opção de mudar o namespace do código fonte gerado e isso causa quebra de interoperabilidade entre linguagens.
dotnet tool install --global Apache.Avro.Tools
avrogen -s ./Pessoa.avsc . --namespace "playground.kafka:playground.kafka"
local server: http://localhost:8081/
Rotas:
GET /subjects
GET /subjects/{subject}/versions
GET /subjects/{subject}/versions/{version}
GET /subjects/{subject}/versions/{version}/referencedby
GET /schemas
GET /schemas/ids/{id}
GET /schemas/ids/{id}/versions
http://localhost:8081/subjects/playground.kafka.Pessoa/versions/1
log.retention.check.interval.ms
: Frequência para verificar se algum log é elegível para exclusão. Default: 5 min (Exclusão ou compactação de acordo com cleanup.policy do tópico)
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic kafka-flow-playground \
--property parse.key=true \
--property key.separator=:
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic kafka-flow-playground \
--from-beginning \
--property print.key=true
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --delete --group dotnet-playground & \
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --delete --group java-playground
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic basic-playground
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic avro-playground
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic kafka-flow-playground
kafka-topics.sh --bootstrap-server localhost:9092 --topic topic1 --describe
# criar tópico - com politica de compactação (parâmetros agressivos para o teste).
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic cadastros \
--config cleanup.policy=compact \
--config segment.ms=100 \
--config min.cleanable.dirty.ratio=0.01
# produzir dados no formato "key:value"
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic cadastros \
--property parse.key=true \
--property key.separator=:
# consumer
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic cadastros \
--from-beginning \
--property print.key=true \
--timeout-ms 1000
# excluir
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic cadastros
Tópico com configuração tradicional de exclusão para efeito de comparação.
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic cadastros \
--config cleanup.policy=delete \
--config retention.ms=10000
# consumer para exemplo "05 without-consumer-group"
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic without-consumer-group-playground \
--from-beginning \
--property print.key=true \
--timeout-ms 1000