An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

README

          

Goncolos
=====================================================

![example workflow name](https://github.com/Trendyol/goncolos/workflows/Test/badge.svg)

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);
}
}
}
```