메시지 처리에 실패하면 동일한 메시지를 다시 사용하십시오.


10

Confluent.Kafka .NET 클라이언트 버전 1.3.0을 사용하고 있습니다. 나는 문서를 따르고있다 :

var consumerConfig = new ConsumerConfig
{
    BootstrapServers = "server1, server2",
    AutoOffsetReset = AutoOffsetReset.Earliest,
    EnableAutoCommit = true,
    EnableAutoOffsetStore = false,
    GroupId = this.groupId,
    SecurityProtocol = SecurityProtocol.SaslPlaintext,
    SaslMechanism = SaslMechanism.Plain,
    SaslUsername = this.kafkaUsername,
    SaslPassword = this.kafkaPassword,
};

using (var consumer = new ConsumerBuilder<Ignore, string>(consumerConfig).Build())
{
    var cancellationToken = new CancellationTokenSource();
    Console.CancelKeyPress += (_, e) =>
    {
        e.Cancel = true;
        cancellationToken.Cancel();
    };

    consumer.Subscribe("my-topic");
    while (true)
    {
        try
        {
            var consumerResult = consumer.Consume();
            // process message
            consumer.StoreOffset(consumerResult);
        }
        catch (ConsumeException e)
        {
            // log
        }
        catch (KafkaException e)
        {
            // log
        }
        catch (OperationCanceledException e)
        {
            // log
        }
    }
}

문제는 내가 줄을 주석으로 경우에도 있다는 것입니다 consumer.StoreOffset(consumerResult);, 나는 다음 사용되지 않은 메시지를 내가 다음 번가 계속 소모를 즉, 유지 오프셋 (offset)는, 즉 무엇 문서가 요구 될 것 같지 않는 증가 적어도 하나의 전달 .

심지어 내가 설정하는 경우 EnableAutoCommit = false와 제거 'EnableAutoOffsetStore = 거짓'는 설정에서, 그리고 교체 consumer.StoreOffset(consumerResult)consumer.Commit()내가 주석 즉하더라도, 난 여전히 같은 행동을보고 Commit, 나는 아직도 다음 사용되지 않은 메시지가 계속.

나는 여기에 근본적인 것이 빠져 있다고 생각하지만 무엇을 알 수는 없습니다. 도움을 주셔서 감사합니다!


메시지는 이미 kafka 관점에서 응용 프로그램으로 반환되었으므로 커밋하면 마지막 커밋 된 오프셋으로 저장되지만 소비 여부에 관계없이 다음 메시지가 계속 반환됩니다. 당신의 기대는 무엇입니까? 커밋 및 소비 전후에 발생할 것으로 예상되는 내용을 자세히 설명해 주시겠습니까?
Sagar Veeram

seek to offset을 사용할 때까지 메시지가 다시 페치되지 않습니다. 이는 소비에 영향을 미치며 탐색 오프셋에서 메시지가 반환됩니다.
Sagar Veeram

@ user2683814 내 게시물에서 EnableAutoCommit설정 내용에 따라 두 가지 시나리오를 언급 했습니다. 우리가 가지고 있다고 가정 해 보자 . 오프셋이 11 인 메시지를 다시 얻는다. 메시지를 처리하는 것이 계속해서 호출되지 않으면 오프셋 11이있는 동일한 메시지가 계속해서 계속 EnableAutoCommit = false나타날 Consume것으로 기대 Commit했다.
havij

아니요, 그렇지 않습니다. 이미 주제를 다룬 후에 Consume사용하여 폴링 ( ) 을 제어 할 수 없습니다 . 장면 뒤의 Kafka (클라이언트 lib에서와 같이)는 앱에 보낸 모든 오프셋을 유지 하고 선형으로 보냅니다. 따라서 실패 시나리오에서와 같이 메시지를 재 처리하려면 코드에서 메시지를 추적하고 메시지를 오프셋하고 처리를 시작해야하며 이전 요청에서 이미 처리 된 경우 건너 뛸 항목도 알아야합니다. .net 라이브러리에 익숙하지 않지만 이것이 kafka 디자인이므로 실제로 중요하지 않습니다. CommitSubscribeConsume
Sagar Veeram

구독 및 할당을 조합하여 사용해야하며 사용 사례를 지원하기 위해 다른 소비자가 필요할 수 있습니다. 실패한 경우, 한 소비자가있는 메시지를 재 처리하기 위해 주제 파티션에 대해 assign / seek를 사용하여 오프셋하고 정상 처리를 위해 subscribe / Consume / Commit 플로우가있는 다른 소비자를 사용하십시오.
Sagar Veeram

답변:



0

5 번과 같이 정해진 횟수만큼 각 메시지를 처리하기위한 재시도 로직을 원할 수 있습니다. 5 번의 재시도 중에 성공하지 못하면이 메시지를 다른 주제에 추가하여 모든 메시지를 처리 ​​할 수 ​​있습니다 실제 주제보다 우선하는 실패한 메시지 또는 실패한 메시지를 동일한 주제에 추가하여 다른 모든 메시지가 사용 된 후에 나중에 선택되도록 할 수 있습니다.

5 번의 재시도 내에서 메시지 처리에 성공하면 큐의 다음 메시지로 건너 뛸 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.