Page History
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 | ||
---|---|---|
| ||
BootstrapServers = "webnori-kafka.servicebus.windows.net:9093" |
여기서 지정한 이름은 Kafka의 Brokers에 해당하는 제잎 앞단의 서브도메인이 됩니다.
Port는 9093으로 SSL만 지원합니다. ( KAFKA기준 정확한 보안 프로토콜명은 : SaslSsl , Kafka의 기능을 사용하여 핸드쉐이크가 이루어짐)
모니터링
Warning |
---|
생성후 KAFKASUFACE가 활성화되는지 체크합니다. ( 저의경우 기본플랜으로 선택하였다가 한번의 삽질후, 상위 플랜으로 조정하니 활성화가 되었습니다.) |
액터모델을 통해 Kafka 메시지 생성 - 닷넷코어전용
...
EventHub
사전준비
AkkaDotModule은 AKKA.net을 포함 KAFKA사용을 조금더 쉽게 한 모듈입니다.
https://docswww.microsoftnuget.comorg/ko-kr/azure/event-hubs/event-hubs-create
모니터링
...
웁쓰~ KAFKA와 연결하기 위해 여기까지 고생하였는데~ KAFKA SURFACE가 지원되지 않는다란 경고가 뜹니다.
셋팅과정에 알려주면 좋을텐데~ 영문메뉴얼을 자세히 살펴보니 기본 Plan에는 지원되지 않고
표준이상의 Plan에서만 지원합니다. (지우고 다시생성)
약 두배의 과금이기때문에... 빠르게 시도후 인스턴스 정리하세요 ( 한달 약 2만원정도 )
혹시모를 과금 사태를 대비하기 위해 오토 스케일아웃 옵션은 꼭 끄시기를 ( 자동으로 인스턴스 증가되어 요금 폭탄이 될수 있습니다.)
SAS 정책추가
Akka.net Kafka Stream 연결하기
종속성
Code Block | ||
---|---|---|
| ||
<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" /> |
...
packages/AkkaDotModule.Webnori/
SAS 정책추가
Code Block | ||
---|---|---|
| ||
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공유하는 이유는 , 듀토리얼들이 접속문자열이 보안의 문제로 마스킽처리가 되는데, 그 비밀을 알기위한 삽질방지입니다.)
접근보안추가
공유할수 있는이유는, IP Base로 사용할수 있는 네트워크를 한번더 걸어 놓았습니다.
Ip허용을 추가로 걸어놓았기때문에 , 접속 String을 알고 있다고 하더라도 전송하지 못합니다. ( 2중보안 - 공격대응에 비용이증가하는지 검토못하였으니 공격은 하지말아주세요)
Kafka(EventHub) 전송하기
Code Block | ||
---|---|---|
| ||
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에 카프카 모드로 전송
참고링크
- 전송 모듈의 소스 : https://github.com/psmon/AkkaDotModule
- MS-원본문서 : https://docs.microsoft.com/ko-kr/azure/event-hubs/event-hubs-about
- 레거시 모듈로 사용하기 : https://docs.microsoft.com/ko-kr/azure/event-hubs/event-hubs-dotnet-standard-get-started-send-legacy
- Kafka-Docker-AkkaStream Mode : KAFKA 닷넷코어에서 쉽고강력하게 활용하기
- AKKA.net Stream : https://getakka.net/articles/streams/introduction.html
- Kafka-Security : https://springboot.cloud/31
- 공유 Access 서명 : https://docs.microsoft.com/ko-kr/azure/event-hubs/authenticate-shared-access-signature
...