Azure eventhub多个分区键指向同一个分区

时间:2015-02-03 06:00:19

标签: azure azure-eventhub

我们正在开发一个多租户应用程序,其中eventhub将在不同的租户之间共享。我们将在租户中分配分区。每个租户都会在不同的分区上发送消息。我们想要在分区级别上验证租户。如Microsoft网站上所述,我们根据租户ID定义了分区密钥。但问题是多于一个分区键在同一分区上发送消息。不应该是这种情况。理想情况下,每个分区键都应映射到不同的分区。

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

请帮助我了解我的方法有什么问题。

1 个答案:

答案 0 :(得分:3)

很简单,可能的字符串分区键的〜无限空间被映射到事件中心内的非常有限的分区空间。除非您向Microsoft询问更多,否则您的EventHub中最多有32个分区。分区键被散列,然后散列空间在分区空间之间划分。这为documentation

提供了保证
  

事件中心确保共享相同分区键值的任何和所有事件按顺序传递到同一分区。重要的是,如果分区键与发布者策略一起使用(如下一节所述),则发布者的身份和分区键的值必须匹配。

在这种具有良好性能的系统中,无法保证并且无法保证每个分区密钥都会转到不同的分区。其中一些内容在this question中讨论过。使用发布商政策,您也知道

  

使用发布者策略时,PartitionKey值设置为发布者名称。为了正常工作,这些值必须匹配。

表示来自单个发布者的所有事件都转到单个分区。就个人而言,我并不认为这总是一件好事,因为每个发布商最终都会有一个吞吐量单位的硬盘(如果你不太喜欢散列的话,会更少)。

如果您需要将每个客户的数据分离到不同的分区中,并通过提供给客户的凭证来直接与EventHub对话,我认为您唯一的选择可能是使用多个EventHub。我相信(在某种意义上我还没有检查过我们的账单),同一服务总线内的EventHubs共享吞吐量单位。

但是,如果您只是需要您的消费者能够告诉它来自哪个发布者/客户,那么我相信您可以使用EventData.PartitionKey,保证是上面记录的出版商名称。