Azure的eventhub多个分区的关键点,以同一个分区(Azure eventhub multi

2019-10-21 18:09发布

我们正在这里eventhub将不同租户之间共享的多租户应用。 我们将我们的租户中分配的分区。 每个租户将在不同的分区发送消息。 我们要验证在分区级别租户。 作为微软的网站介绍中,我们定义了基于租户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);

请帮助我了解什么是错我的做法。

Answer 1:

简单地说了〜可能的字符串分区键的无限空间被映射到活动中心内的分区非常有限的空间。 除非你问微软更多的你有你的EventHub内最多32个分区。 分区键被散列,然后将散列空间被划分之间的分区的空间。 这提供了在保证文档

事件集线器确保任何和所有事件共享相同的分区键值,以便交付,并在同一个分区。 重要的是,如果分区键与出版商的政策,在接下来的部分中描述使用,则发布者的身份和分区键的值必须匹配。

什么是不保证的,不能在这种性能良好系统的保障,是每个分区键,可进入不同的分区。 有些情况在讨论这个问题 。 随着发行政策,你也知道,

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

这意味着从单一的发布者的所有事件到一个分区。 就个人而言,我不认为这总是一件好事,因为你最终有一个吞吐量单元的每出版商硬工资帽(较少,如果你在散列不吉利)。

如果你需要在不同的分区,每个客户的数据的分离与这个被赋予客户直接交谈的EventHub凭据强制执行,我觉得你的唯一选择,可使用多个EventHubs。 我相信,(在这个意义上我没有检查我们的法案还),同样的服务总线份额吞吐量单位内EventHubs。

但是,如果你只需要你的消费者能告诉什么发行商/客户的它是从哪里来的,那么我相信你可以只使用EventData.PartitionKey这是保证发布者的名称如上面记录。



文章来源: Azure eventhub multiple partition key points to same partition