kafka 연동

안녕하세요.

현재 .net Framework 프로젝트에 kafka를 바로 연동이 불가 하여 프로젝트를 하나 더 생성하여 .net Core 프로젝트를 참조하는 형태로 연동 테스트를 진행하고 있습니다.

Producer, Consumer 테스트 진행에는 이상이 없는데 Consumer 에서 계속 데이터를 수집하는 형식이 아니라 수집 시 추가 수집 데이터가 없으면 그만 멈추고 다시 제가 원할 때 호출하여 수집을 하는 형식으로 하고 싶은데 방법이 없을까요?

try
        {
            Console.WriteLine("--------------- Start Consumer ---------------");

            var config = new ConsumerConfig
            {
                BootstrapServers = "broker01,broker02,broker03",
                //ClientId = Dns.GetHostName(),
                GroupId = "GroupId",
                AutoOffsetReset = AutoOffsetReset.Earliest,
                EnableAutoCommit = true
            };

            using(var consumer = new ConsumerBuilder<Ignore, string>(config).Build())
            {
                consumer.Subscribe("topic");

                CancellationTokenSource cts = new CancellationTokenSource();

                try
                {
                    while(!cts.IsCancellationRequested)
                    //while (true)
                    {
                        try
                        {
                            var consumerResult = consumer.Consume(cts.Token);   //  get consume result
                           
                            if(consumerResult.Message == null)
                            //if (consumerResult.IsPartitionEOF)
                            {
                                Console.WriteLine("--------------- IsPartitionEOF ---------------");
                                consumer.Close();
                                break;
                            }
                            //consumer.Commit(consumerResult);
                        }
                        catch (ConsumeException cex)
                        {
                            Console.WriteLine("consumerException : " + cex.Message);
                        }
                        catch(Exception ex)
                        {
                            Console.WriteLine("consumer exception : " + ex.Message);
                        }
                    }
                }
                catch (OperationCanceledException ocex)
                {
                    Console.WriteLine($"OperationCanceledException : {ocex.Message}");
                    consumer.Close();
                }
                catch(Exception ex)
                {
                    Console.WriteLine($"exception : {ex.Message}");
                    consumer.Close();
                }
                finally
                {
                    consumer.Close();
                }

                Console.WriteLine("--------------- End Consumer -------------- - ");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"ex : {ex.Message}");
        }
2개의 좋아요

카프카카 메시징 기반 게시/구독 메시지 브로커군요. 저는 사용 경험이 없습니다.

그나저나 메시지를 받으면 구독한 것을 취소하고 필요할 때 다시 구독 하면 될 것 같은데, 그렇게 처리가 안되나요?

2개의 좋아요

메세지가 없을 때 구독을 끊는 이유는 무엇인가요?

1개의 좋아요

한건씩 계속 메소드를 호출하는것보다는 해당 메소드 안에서 다 가져오고 싶어서 입니다.

1개의 좋아요

특정 원하는 경우에만 호출하여 처리하고 싶어서요

1개의 좋아요

일반적인 상황이라면 @dimohy 님께서 제안하신 방법으로 처리하면 해결될 것 같아요.
그런데 메서드 하나 작성하고 이로써 통제하길 원하신다면 메시지 큐 라이브러리를 사용하는 것은 부적절해 보입니다.
사용목적이 많이 다른 것 같이 느껴지기 때문입니다.

질문자님께서 원하신대로 동작하려면 직접 구현하는 것이 제일 빠를거에요.
ConcurrentQueue를 필드로 갖는 Service 클래스를 하나 만들어놓고 이를 싱글톤으로 운영하면서 Build() 또는 Run() 메서드에 원하는 기능이 들어가면 될 것 같아요.

2개의 좋아요

카프카의 오프셋과 토픽 두개를 활용하면 가능할듯하네요

카프카는 전송보장기능이 있기때문에, 소비하는 쪽에서 구간만큼 읽고 마지막 읽은 저장구간에 체크포인트 걸고 다음 읽을때 다음 위치에서 읽기가능하며 , 주로 소비자가 잘못되었을때 복구처리에 사용되며 ,이 처리를 토픽 1로 이벤트 순차처리용도로 활용하고

생산이 특정개수 혹은 특정타이밍 때 이것을 처리해를 토픽2로 생산한후 내가원하는 타이밍을 토픽에 생산을하여 구독하는 쪽에서 토픽1의 구간처리를 하면 가능할것으로 보입니다.

또는 토픽 하나모드로 더 단순화하면 타이머가 주기적으로 오프셋을 체크하여 증가한 구간처리만 하면 될것으로 보입니다.

핵심은 실시간 구독이아니여도되며, 카프카가 보관하는 기간만큼 원하는 오프셋 구간 처리가능하다란것입니다.

참고 : OffSet을 관리하고, 구간탐색기능 사용하여 배치처리기처럼 구현

            var topicPartitionOffset = new TopicPartitionOffset("Test_1", new Partition(0), new Offset(278));

            consumer.Assign(topicPartitionOffset);
            

링크 : How to Consume from specific TopicPartitionOffset with Confluent.Kafka in .Net - Stack Overflow

4개의 좋아요