public async Task IniciarConsumo(CancellationTokenSource cts) { //para permitir que em caso de erro, não realizar commit para não perder a mensagem _brokerHelper.ConsumerConfig.EnableAutoCommit = false; _brokerHelper.ConsumerConfig.AutoOffsetReset = AutoOffsetReset.Earliest; _brokerHelper.ConsumerConfig.GroupId = _consumerGroup; using (var consumer = new ConsumerBuilder <string, string>(_brokerHelper.ConsumerConfig).Build()) { consumer.Subscribe(_topico); var fakeDatabase = new FakeDatabase(_messageWriter); while (!cts.IsCancellationRequested) { try { var cr = consumer.Consume(cts.Token); _messageWriter.Write($"Consumiu (key : message): {cr.Message.Key} : {cr.Message.Value} no offset {cr.Offset}", MessageType.Output); fakeDatabase.BeginTransaction(); if (SimularProcessamentoBemSucedido()) { _messageWriter.Write($"Processou com sucesso e realizou commit do offset {cr.Offset}", MessageType.Output); fakeDatabase.Commit(); consumer.Commit(cr); } else { _messageWriter.Write($"Erro no processamento pós consumo. Não realizou commit do offset {cr.Offset}", MessageType.Output); fakeDatabase.Rollback(); consumer.Subscribe(_topico); //forçar recomeçar a leitura a partir do último registro commited } await Task.Delay(1000); } catch (ConsumeException e) { _messageWriter.Write($"Falha no consumo: {e.Error.Reason}", MessageType.Input); } } } }