2

我们正在开发一个多租户应用程序,其中 eventthub 将在不同租户之间共享。我们将在租户之间分配分区。每个租户都会在不同的分区上发送消息。我们想在分区级别对租户进行身份验证。如 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);

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

4

1 回答 1

6

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

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

在这种具有良好性能的系统中,无法保证并且无法保证的是每个分区键都转到不同的分区。这个问题中讨论了其中的一些内容。通过发布商政策,您还知道

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

这意味着来自单个发布者的所有事件都转到单个分区。就个人而言,我认为这并不总是一件好事,因为每个发布者最终都会获得一个吞吐量单位的硬上限(如果你在散列方面不走运,则更少)。

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

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

于 2015-02-03T21:17:47.427 回答