簡體   English   中英

如何使用分區以使用 .NET Core C# 在 kafka 中並行使用一個主題?

[英]How to use partitions in order to parallel consume one topic in kafka with .NET Core C#?

我們使用 .NET Kafka 客戶端在 C# 代碼中使用來自一個主題的消息。 然而,它似乎有點太慢了。

想知道我們是否可以稍微並行化這個過程,所以我在那里檢查了這個答案: Kafka 如何並行使用一個主題

但是在下面的示例中,我並沒有真正看到如何使用 .NET Kafka 客戶端來實現這個分區:

var consumerBuilder = new ConsumerBuilder<Ignore, string>(GetConfig())
    .SetErrorHandler((_, e) => _logger.LogError("Kafka consumer error on Revenue response. {@KafkaConsumerError}", e));

using (var consumer = consumerBuilder.Build())
{
    consumer.Subscribe(RevenueResponseTopicName);

    try
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var consumeResult = consumer.Consume(stoppingToken);

            RevenueTopicResponseModel revenueResponse;
            try
            {
                revenueResponse = JsonConvert.DeserializeObject<RevenueTopicResponseModel>(consumeResult.Value);
            }
            catch
            {
                _logger.LogCritical("Impossible to deserialize the response. {@RevenueConsumeResult}", consumeResult);
                continue;
            }
            _logger.LogInformation("Revenue response received from Kafka. {RevenueTopicResponse}",
                consumeResult.Value);

            await _revenueService.RevenueResultReceivedAsync(revenueResponse);
        }
    }
    catch (OperationCanceledException)
    {
        _logger.LogInformation($"Operation canceled. Closing {nameof(RevenueResponseConsumer)}.");
        consumer.Close();
    }
    catch (Exception e)
    {
        _logger.LogCritical(e, $"Unhandled exception during {nameof(RevenueResponseConsumer)}.");
    }
}

您需要創建具有多個分區的主題,假設為 10。在您的代碼中,使用相同的消費者組創建 10 個消費者 - 代理將在您的消費者之間分發主題消息。

基本上,只需將您的代碼放入for循環中:

for (int i = 0; i < 10; i++)
{
    var consumerBuilder = new ConsumerBuilder<Ignore, string>(GetConfig())
    .SetErrorHandler((_, e) => _logger.LogError("Kafka consumer error on Revenue response. {@KafkaConsumerError}", e));

    using (var consumer = consumerBuilder.Build())
    {
        // your processing here
    }
}

為了正確回答這個問題,我們需要知道這個分區要求背后的原因是什么。

如果您的主題沒有大量要處理的消息,則不能使用分區。 如果問題是單個消息處理花費了太多時間並且您希望並行化工作,那么您可以將消費的消息添加到Channel並在后台根據需要擁有該通道的盡可能多的使用者。

基本上你仍然應該為每個進程使用一個消費者,因為消費者在后台使用線程

您也可以在文章中找到我對 C# 中Kafka Consumer 的考慮

如果您有任何問題,請隨時提問! 我很樂意幫助你

您可以在一組偏移后提交,而不是在每個偏移上提交,這可以為您帶來一些性能優勢。

if( result.offset % 5 == 0)
{
   consumer.Commit(result)
}

假設 EnableAutoCommit = false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM