2015-02-03 2 views
1

우리는 eventhub가 다른 임차인들과 공유되는 멀티 테넌트 (multi-tenant) 애플리케이션을 개발 중입니다. 우리는 세입자들에게 분할을 배포 할 것입니다. 모든 임차인은 다른 파티션에 메시지를 보냅니다. 우리는 파티션 레벨에서 세입자를 인증하려고합니다. Microsoft 사이트에서 설명한 것처럼 세입자 ID를 기준으로 파티션 키를 정의했습니다. 그러나 문제는 하나 이상의 파티션 키가 같은 파티션에 메시지를 보내는 것입니다. 어떤 경우에는 안된다. 이상적으로 모든 파티션 키는 다른 파티션에 매핑되어야합니다.Azure eventhub 동일한 파티션에 여러 파티션 키 포인트

 var serviceNamespace = "namespace name here"; 
     var hubName = "hub name here"; 
     var deviceName = "device name here"; 
     var sasToken = "SAS TOKEN HERE"; 

     Mymessage subGroup1 = CreateMessage(); 

     var factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, ""), new MessagingFactorySettings 
     { 
      TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sasToken), 
      TransportType = TransportType.Amqp 
     }); 
     var client = factory.CreateEventHubClient(String.Format("{0}/publishers/{1}", hubName, deviceName)); 

     var data = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(subGroup1))); 
     data.PartitionKey = "jeep"; 

     client.Send(data); 

내 접근 방식에있어 잘못된 점을 이해해주세요.

답변

3

가능한 문자열 파티션 키의 ~ 무한한 공간은 이벤트 허브 내의 파티션의 매우 한정된 공간에 매핑됩니다. Microsoft에 더 많은 것을 요청한 경우가 아니라면 EventHub에서 최대 32 개의 파티션을 보유해야합니다. 파티션 키가 해시 된 다음 해시 공간이 파티션 공간으로 분할됩니다. documentation

이벤트 허브를 사용하면 동일한 파티션 키 값을 공유하는 모든 이벤트가 동일한 파티션으로 전달되도록 할 수 있습니다. 중요한 것은 파티션 키가 게시자 정책과 함께 사용되는 경우 다음 섹션에서 설명하며 게시자의 ID와 파티션 키의 값이 일치해야합니다.

성능이 좋은 이런 종류의 시스템에서 보장 할 수없는 것은 각 파티션 키가 다른 파티션으로 이동한다는 것입니다. 이 중 일부는 this question에서 논의됩니다. 게시자 정책을 사용하면 해당 내용도 알 수 있습니다.

게시자 정책을 사용하는 경우 PartitionKey 값은 게시자 이름으로 설정됩니다. 제대로 작동하려면이 값이 일치해야합니다.

이는 단일 게시자의 모든 이벤트가 단일 파티션으로 이동한다는 것을 의미합니다. 개인적으로, 나는 항상 좋은 일이라고 생각하지 않습니다. 왜냐하면 퍼블리셔 당 하나의 처리량 단위 (해시가 불충분 한 경우)가 적어지기 때문입니다.

EventHub과 직접 대화하기 위해 고객에게 제공 한 자격 증명으로 다른 파티션에서 각 고객의 데이터를 분리해야하는 경우 유일한 옵션은 여러 EventHubs를 사용하는 것일 수 있습니다. I (아직 우리 청구서를 조사하지 않았다는 의미입니다) 동일한 서비스 버스 공유 처리량 단위 내의 EventHubs를 믿습니다.

그러나 소비자가 어떤 출판사/고객인지 말할 수 있어야하는 경우 위의 문서화 된대로 게시자 이름이 될 EventData.PartitionKey을 사용할 수 있습니다.

+0

이벤트 허브는 동일한 네임 스페이스가 처리량 단위를 공유합니다. 그러나 다른 이벤트 허브의 문제는 우리가 소비자 역할을 공유 할 수 없다는 것입니다. 우리 세입자 중 일부는 매우 느린 속도로 데이터를 전송할 것입니다. 그들에 대한 소비자 역할이 다르다는 것은 말이되지 않습니다. 그런 다음 고 가용성을 달성하기 위해 소비자 (작업자 역할 시스템)의 두 인스턴스를 만들어야합니다. 우리는 SaaS 애플리케이션을 만들고 싶습니다. 리소스를 세입자가 공유하여 비용을 줄이는 것이 좋습니다. – Pragmatic

+0

그 경우 나는 귀하의 선택이 마지막 문장에있는 것이라고 믿습니다. 그것은 PartitionKey를 사용하여 다른 클라이언트의 데이터를 분리합니다. 당신은 여전히 ​​확장 성 모자를 쥐고있다. – cacsar

+0

리버스 엔지니어링을 수행 할 수 없습니다. 어떤 문자열이 partition1에 매핑되는지 확인한 다음 parition2를 확인하는 등의 작업을 할 수 있습니다.그런 다음이 문자열을 사용하여 SAS 키를 생성 할 수 있습니다. 우리는 이러한 문자열을 우리의 거주자들에게 배포 할 수 있습니다. 이렇게하면 'xxxx'문자열이 'partition_x'에 매핑되고 'sas_key_x'는 partition_x에 데이터를 전달하는 데에만 사용될 수 있습니다. 나는 이것이 깨끗하지는 않지만 목적을 달성 할 수 있다는 것을 알고있다. – Pragmatic

관련 문제