Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.



Note

시간날때 짬짬이~ 연결중인 내용으로 아직 시도중에 있는 컨텐츠입니다.

Tip

Azure 의 EventHub를 셋팅하고  .Net Core Akka-Kafka Stream으로 연결을 시도해보았습니다.net 액터모델을 만들고 기능을 탑재해보겠습니다.

EventHub를 사용하는 전반적인 느낌은, KAFKA의 기능을 흡수한 KAFKA-SASS 였으며 

KAFKA의 셋팅과 토픽관리를 Azure 포털로 간편하게 할수 있었습니다.AkkaKafkaStream기를 선택한 이유는, 스트림기에 연결하는 클라이트역시 그에 준하는

스트림 처리능력이 있어야한다는 지론입니다.

Event Hub소개

Event Hubs는 구성 또는 관리 오버헤드가 거의 없는 완전 관리형 PaaS(Platform-as-a-Service)이므로 비즈니스 솔루션에 집중할 수 있습니다. Apache Kafka 에코시스템을 위한 Event Hubs는 클러스터를 관리, 구성 또는 실행할 필요가 없는 PaaS Kafka 환경을 제공합니다.

...

  • 이벤트 생산자: 이벤트 허브에 데이터를 보내는 엔터티입니다. 이벤트 게시자는 HTTPS 또는 AMQP 1.0 또는 Apache Kafka 1.0 이상을 사용하여 이벤트를 게시할 수 있습니다.
  • 파티션: 각 소비자는 메시지 스트림의 특정 하위 세트 또는 파티션만 읽습니다.
  • 소비자 그룹: 전체 이벤트 허브의 보기(상태, 위치 또는 오프셋)입니다. 소비자 그룹을 사용하면 각기 별도의 이벤트 스트림 보기가 표시되는 애플리케이션을 사용할 수 있습니다. 소비자는 자신의 속도로 자신의 오프셋을 통해 독립적으로 스트림을 읽습니다.
  • 처리량 단위: Event Hubs의 처리량 용량을 제어하는 미리 구입한 용량 단위입니다.
  • 이벤트 수신기: 이벤트 허브에서 이벤트 데이터를 읽는 엔터티입니다. 모든 Event Hubs 소비자는 AMQP 1.0 세션을 통해 연결합니다. Event Hubs 서비스는 사용할 수 있게 되면 세션을 통해 이벤트를 제공합니다. 모든 Kafka 소비자는 Kafka 프로토콜 1.0 이상을 통해 연결합니다.


개념적 맵핑

항목(Topic) 만들기

여기서 이벤트허브의 name은 , kafka의 topic에 해당하며, "akka100" 이라고 생성해두겠습니다. ( 아래 테스트 샘플에 사용되는 토픽명)

가격

카프카인터페이스를 활용하려면 기본이아닌 표준플랜을 사용해야 

Kafka 인터페이스가 활성화됩니다. ( 몇번 삽질끝에 알아냄, Kafka활용하려면 소비자 그룹 1은 부족하며 메시지당 이용가격은 동일하나 고정 인스턴스 비용이 2배이네요)

생성

자세한 정보 : 

Code Block
themeDJango
BootstrapServers = "webnori-kafka.servicebus.windows.net:9093"

여기서 지정한 이름은 Kafka의 Brokers에 해당하는 제잎 앞단의 서브도메인이 됩니다.

Port는 9093으로 SSL만 지원합니다. ( KAFKA기준 정확한 보안 프로토콜명은 : SaslSsl , Kafka의 기능을 사용하여 핸드쉐이크가 이루어짐)

모니터링

Image Added

Warning

생성후 KAFKASUFACE가 활성화되는지 체크합니다.

( 저의경우 기본플랜으로 선택하였다가 한번의 삽질후, 상위 플랜으로 조정하니 활성화가 되었습니다.)



액터모델을 통해 Kafka 메시지 생성 - 닷넷코어전용

...

EventHub

사전준비

AkkaDotModule은 AKKA.net을 포함 KAFKA사용을 조금더 쉽게 한 모듈입니다.

https://docswww.microsoftnuget.comorg/ko-kr/azure/event-hubs/event-hubs-create

모니터링

Image Removed

...

웁쓰~ KAFKA와 연결하기 위해 여기까지 고생하였는데~  KAFKA SURFACE가 지원되지 않는다란 경고가 뜹니다.

셋팅과정에 알려주면 좋을텐데~ 영문메뉴얼을 자세히 살펴보니 기본 Plan에는 지원되지 않고

표준이상의 Plan에서만 지원합니다. (지우고 다시생성)

약 두배의 과금이기때문에... 빠르게 시도후 인스턴스 정리하세요 ( 한달 약 2만원정도 )

혹시모를 과금 사태를 대비하기 위해 오토 스케일아웃 옵션은 꼭 끄시기를  ( 자동으로 인스턴스 증가되어 요금 폭탄이 될수 있습니다.)

SAS 정책추가

Image Removed

Akka.net Kafka Stream 연결하기

종속성

Code Block
themeEmacs
    <PackageReference Include="Akka" Version="1.4.12" />
    <PackageReference Include="Akka.Streams" Version="1.4.12" />
    <PackageReference Include="Akka.Streams.Kafka" Version="1.1.0" />
    <PackageReference Include="Akka.Cluster" Version="1.4.12" />

Image Removed

...

packages/AkkaDotModule.Webnori/


SAS 정책추가

Image Added

Code Block
themeEmacs
            var producerAkkaOption = new ProducerAkkaOption()
            {
                BootstrapServers = "webnori-kafka.servicebus.windows.net:9093",
                ProducerName = "webnori-kafka",
                SecuritOption = new KafkaSecurityOption()
                {
                    SecurityProtocol = SecurityProtocol.SaslSsl,
                    SaslMechanism = SaslMechanism.Plain,
                    SaslUsername = "$ConnectionString",
                    SaslPassword = "Endpoint=sb://webnori-kafka.servicebus.windows.net/;SharedAccessKeyName=kafka-client;SharedAccessKey=PfL0qRUm50AXZHRXLiVfnatIRI3OqAh+dT6Owsqrd2M=",
                    SslCaLocation = "./cacert.pem"
                }
            };

위에 생성한 정책은 , 연결문자를 SaslPassword 부분에 붙여넣기 하면되겠습니다.

( 실제 테스트성공한 문자열을 Full공유하는 이유는 , 듀토리얼들이 접속문자열이 보안의 문제로 마스킽처리가 되는데, 그 비밀을 알기위한 삽질방지입니다.)

접근보안추가

Image Added

공유할수 있는이유는, IP Base로 사용할수 있는 네트워크를 한번더 걸어 놓았습니다.

Ip허용을 추가로 걸어놓았기때문에 , 접속 String을 알고 있다고 하더라도 전송하지 못합니다. ( 2중보안 - 공격대응에 비용이증가하는지 검토못하였으니 공격은 하지말아주세요)


Kafka(EventHub) 전송하기

Code Block
themeEmacs
            var producerAkkaOption = new ProducerAkkaOption()
            {
                BootstrapServers = "webnori-kafka.servicebus.windows.net:9093",
                ProducerName = "webnori-kafka",
                SecuritOption = new KafkaSecurityOption()
                {
                    SecurityProtocol = SecurityProtocol.SaslSsl,
                    SaslMechanism = SaslMechanism.Plain,
                    SaslUsername = "$ConnectionString",
                    SaslPassword = "Endpoint=sb://webnori-kafka.servicebus.windows.net/;SharedAccessKeyName=kafka-client;SharedAccessKey=PfL0qRUm50AXZHRXLiVfnatIRI3OqAh+dT6Owsqrd2M=",
                    SslCaLocation = "./cacert.pem"
                }
            };

            string producerActorName = "producerActor";

            var producerActor= AkkaLoad.RegisterActor(producerActorName /*AkkaLoad가 인식하는 유니크명*/,
                actorSystem.ActorOf(Props.Create(() => 
                    new ProducerActor(producerAkkaOption)),
                    producerActorName /*AKKA가 인식하는 Path명*/
            ));

            producerActor.Tell(new BatchData()
            {
                Data = new KafkaTextMessage()
                {
                    Topic = "akka100",
                    Message = "testData"
                }
            });

샘플 코드 : https://github.com/psmon/AkkaDotModule/blob/master/AkkaDotBootApi/Test/TestAkka.cs



닷넷코어 API 에서 액터모델과 연동하여 EventHub에 카프카 모드로 전송

Image Added



참고링크

...