Kafka消费者提交线程安全

时间:2017-06-26 11:21:03

标签: c# apache-kafka kafka-consumer-api confluent-kafka

我正在使用Confluent.Kafka dotnet客户端。

namespace Confluent.Kafka
{
    public class Consumer<TKey, TValue> : IDisposable
    {
         public Task<CommittedOffsets> CommitAsync();
    }
}

如您所见,Consumer.CommitAsync是一种异步方法。在不等待其响应的情况下调用CommitAsync方法然后拨打Subscribe进行下一次调用是否安全?

以下示例代码。

using (var consumer = new Confluent.Kafka.Consumer<MessageKey, byte[]>(config, new MessageKeyDeserializer(), new ByteArrayDeserializer()))
{
                consumer.Subscribe(topics);

                while (true)
                {
                    Message<MessageKey, byte[]> msg;
                    if (consumer.Consume(out msg, TimeSpan.FromSeconds(1)))
                    {
                        // ...

                        if( msg.Offset % 100 == 0)
                        {
                            consumer.CommitAsync().ContinueWith((t) =>
                           {
                               // log t.Exception
                           }, TaskContinuationOptions.OnlyOnFaulted);
                        }
                    }
                }
}

1 个答案:

答案 0 :(得分:0)

我假设您想说下一次对Consume的调用

是的,这是安全的,没问题。 我还会添加一些提交时间窗口(例如,首先介于5s和100ms之间),这样如果你有一段时间没有收到消息,你仍然会提交它们