https://github.com/trendyol/goncolos
Goncolos is simple wrapper top of confluent-kafka-dotnet
https://github.com/trendyol/goncolos
consumer csharp dotnet kafka kafka-client producer service-bus
Last synced: 8 months ago
JSON representation
Goncolos is simple wrapper top of confluent-kafka-dotnet
- Host: GitHub
- URL: https://github.com/trendyol/goncolos
- Owner: Trendyol
- License: mit
- Created: 2021-10-22T17:13:50.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2025-02-03T11:20:04.000Z (over 1 year ago)
- Last Synced: 2025-03-22T05:33:00.688Z (over 1 year ago)
- Topics: consumer, csharp, dotnet, kafka, kafka-client, producer, service-bus
- Language: C#
- Homepage:
- Size: 50.8 KB
- Stars: 4
- Watchers: 12
- Forks: 1
- Open Issues: 3
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
Goncolos
=====================================================

Goncolos is simple wrapper top of [confluent-kafka-dotnet](https://github.com/confluentinc/confluent-kafka-dotnet)
## Features:
- Bulk message consuming
- Bulk message producing
- Pipeline supports to process consumed messages
## Usage
### Consumer Examples
#### Using Mediator as Dispatcher
```csharp
public class KafkaConsumerService
{
private readonly ILogger _logger;
private readonly IKafkaProducer _kafkaProducer;
private readonly IMediator _mediator;
private IKafkaConsumer _consumer;
public KafkaConsumerService(ILogger logger,IKafkaProducer kafkaProducer,IMediator mediator)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_kafkaProducer = kafkaProducer ?? throw new ArgumentNullException(nameof(kafkaProducer));
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}
public async Task Start(CancellationToken cancellationToken)
{
var config = CreateConfig();
_consumer = new KafkaConsumer(config);
await _consumer.Start(cancellationToken);
}
public async Task Stop()
{
await _consumer.DisposeAsync();
}
private KafkaConsumerConfiguration CreateConfig()
{
var config = new KafkaConsumerConfiguration("localhost:9092", "consumer-group-name", "ProductCreated")
.UseLogger(_logger)
.ConfigureIncomingPipeline(pipe =>
pipe
.UsePipelineStep(new SendFailedMessageToAnotherTopicStep(_logger, _kafkaProducer, new SendFailedMessageToAnotherTopicStepOptions("ProductCreatedErrorTopic")))
.UsePipelineStep(new MessageSerializerStep(new JsonMessageSerializer()))
.UsePipelineStep(new MediatrDispatchStep(_mediator))
);
return config;
}
public class MediatrDispatchStep
:IPipelineStep
{
private readonly IMediator _mediator;
public MediatrDispatchStep(IMediator mediator)
{
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}
public async Task Execute(IncomingMessageContext context, PipelineStepDelegate next)
{
var message = context.Message;
switch (message)
{
case IRequest request:
await _mediator.Send(request, context.CancellationToken);
return;
case IBaseRequest request:
await ((dynamic) _mediator).Send((dynamic) request, context.CancellationToken);
return;
default:
await _mediator.Publish(message, context.CancellationToken);
break;
}
await next(context);
}
}
}
```