You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 20 Next »

Azure 의 EventHub를 셋팅하고  .Net Core Akka.net 액터모델을 만들고 기능을 연결해보겠습니다.

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

KAFKA의 셋팅과 토픽관리를 Azure 포털로 간편하게 할수 있었습니다.


사용프레임워크

  • net core 3.1
  • akka.net
  • Confluent.Kafka

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배이네요)

생성

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

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

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

모니터링

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

( 저의경우 기본플랜으로 선택하였다가 리전변경및 여러번 실패후, 상위 플랜으로 재생성하여 활성화가 되었습니다.  -모든 리전지원합니다.   )



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


셋팅이 끝났으면, 닷넷 코어 어플리케이션을 통해 Auzre 이벤트 허브에 메시징을 생산하는 시도를 해보겠습니다.

사전준비

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

https://www.nuget.org/packages/AkkaDotModule.Webnori/


SAS 정책추가

            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공유하는 이유는 , 듀토리얼들이 접속문자열의경우 보안의 문제로 마스킹처리가 되는데, 삽질방지를 위한 접속가능한 정보를 모두 공개합니다.)

SSL을 위한 Global Root 인증서 : https://github.com/psmon/AkkaDotModule/blob/master/AkkaDotBootApi/cacert.pem


접근보안추가

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

Ip허용을 추가로 걸어놓았기때문에 , 접속 String을 알고 있다고 하더라도 전송하지 못합니다.

( 2중보안이 권장되며, 공격대응에 비용이증가하는지 검토못하였으니 공격은 하지말아주세요 - 비용의 문제로 곧 삭제예정입니다.)

EventHub에 Kafka모드로 메시지 생산하기

EventHub(Kafka)에 가장 심플한 방식으로 전송되게 하려고 노력하였으며

아래와같이 사용하면 되겠습니다. Kafka와 호환되며 SecurityOption이 없으면 비SSL모드로 작동합니다.

            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"
                }
            });

샘플 코드 : 


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

Auzre에서 Kafka 매트릭 모니터링을 기본으로 해줘서, 별도의 모니터링 시스템을 구축안해도되는게 장점인것같네요

메시징을 생산하여, 모니터링 시스템이 반응하여 메시징이 추가되면 연결및 구현성공입니다.

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


<PackageReference Include="Confluent.Kafka" Version="1.5.2" />

Confluent.Kafka를 액터에 연결하여 전송하였으며, Actor모델을 사용안할시 위 모듈을 직접 이용하여

EventHub(Kafka)에 생산및 소비처리가 가능합니다.


next update 예정

ProducerActor 만 작성하였는데, 시간이 되면

1.0.9에서는 ConsumerActor 작성예정입니다.


참고링크


  • No labels